【问题标题】:Why dockered centos doesn't recognize pip?为什么dockered centos不识别pip?
【发布时间】:2019-03-08 07:28:50
【问题描述】:

我想用 python 和几个 centos 上的包创建一个容器。我尝试在原始 centos 容器中运行几个命令。一切正常我已经安装了我想要的一切。然后我使用通过RUN 执行的相同命令创建了Dockerfile,我得到/bin/sh: pip: command not found 有什么问题?我的意思是情况。为什么一切都可以在命令行中执行,但不能用RUN 执行?我已经尝试了这两种变体:

RUN command
RUN command
RUN pip install ...

RUN command\
    && command\
    && pip install ...

我执行的命令:

from centos

run yum install -y centos-release-scl\
    && yum install -y rh-python36\
    && scl enable rh-python36 bash\
    && pip install django

UPD: pip 的完整路径有所帮助。怎么了?

【问题讨论】:

  • @tgogos 我的问题更多的是关于这个问题,而不是关于这个案例。为什么命令从容器内部运行良好但不是通过RUN
  • 另一种方法是在 docker hub 上启动 FROM centos/python-36-centos7

标签: docker pip


【解决方案1】:

你需要先安装 pip 使用

yum install python-pip

或者如果你需要python3(来自epel)

yum install python36-pip

如果不确定,请询问yum

yum whatprovides /usr/bin/pip

python2-pip-18.1-1.fc29.noarch : A tool for installing and managing Python 2 packages
Repo        : @System
Matched from:
Filename    : /usr/bin/pip

python2-pip-18.1-1.fc29.noarch : A tool for installing and managing Python 2 packages
Repo        : updates
Matched from:
Filename    : /usr/bin/pip

python2-pip-18.0-4.fc29.noarch : A tool for installing and managing Python 2 packages
Repo        : fedora
Matched from:
Filename    : /usr/bin/pip

这个输出来自 Fedora29,但你应该在 Centos/RHEL 中得到类似的结果

更新

来自评论

但是当我从 docker run -ti centos all 执行相同的命令时 很好。有什么问题?

也许你的PATH 不知何故坏了?您可以尝试 pip 的完整路径吗?

【讨论】:

  • 但是当我从docker run -ti centos 执行相同的命令时,一切都很好。有什么问题?
【解决方案2】:

正如@rkosegi 已经提到的,它一定是PATH 的问题。以下似乎有效:

FROM centos
ENV PATH /opt/rh/rh-python36/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RUN yum install -y centos-release-scl
RUN yum install -y rh-python36
RUN scl enable rh-python36 bash
RUN pip install django

我通过启动 centos 容器并逐个键入命令“找到”了上述 PATH


BMitch 的幻灯片中有一个很好的解释,可以在这里找到:sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow.html#24

问:为什么 RUN 不工作?

为什么我收到./build.sh 找不到?

RUN cd /app/srcRUN ./build.sh
  • 从 RUN 中保存的唯一部分是文件系统(作为一个新层)。

  • 当 pid 1 退出时,环境变量、启动的守护进程和 shell 状态都与临时容器一起丢弃。

  • 解决方法:用&&合并多行:

    RUN cd /app/src && ./build.sh
    

【讨论】:

    【解决方案3】:

    我知道这是不久前被问到的,但是我只是在构建 Docker 映像时遇到了这个问题,并且无法快速找到一个好的答案,所以我将它留在这里以供后人使用。

    在我的 Dockerfile 中添加 scl enable 命令对我不起作用,所以我发现您可以通过运行 enable scl packages without the scl command

    source /opt/rh/<package-name>/enable.

    如果我没记错的话,你将无法做到:

    RUN source /opt/rh/<package-name>/enable
    RUN pip install <package>
    

    因为每个RUN 命令都会创建一个不同的层,并且不会保留 shell 会话,所以我只是像这样一起运行命令:

    RUN source /opt/rh/rh-python36/enable &amp;&amp; pip install &lt;package&gt;

    我认为 scl 命令在 Dockerfiles 中运行存在问题,因为scl enable &lt;package&gt; bash 会在您当前的 shell 中打开一个新的 shell,而不是将包添加到当前 shell 的路径中。

    编辑:

    Found,您可以通过运行将软件包添加到您的当前 shell

    source scl_source enable <package>
    

    【讨论】:

      猜你喜欢
      • 2022-06-30
      • 2020-01-16
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多