为什么dockered centos无法识别点子?

时间:2019-03-08 07:28:50

标签: docker pip

我想用centos创建一个带有python和几个软件包的容器。我尝试在原始centos容器中运行几个命令。一切正常我已经安装了所有想要的东西。然后,我使用通过Dockerfile执行的相同命令创建了RUN,然后得到/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 :帮助您找到完整的点。怎么了?

3 个答案:

答案 0 :(得分:2)

您需要先使用安装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执行相同的命令时,一切   很好有什么问题吗?

也许您的PATH坏了吗?你可以尝试完整的点子路径吗?

答案 1 :(得分:1)

@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

我通过启动PATH容器并逐个键入命令(因为您已经提到它正在工作)来“找到”上述centos


BMitch的幻灯片中对此有很好的解释:sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow.html#24

  

问:为什么RUN不起作用?

     

为什么找不到./build.sh

RUN cd /app/srcRUN ./build.sh
     
      
  • 从RUN中保存的唯一部分是文件系统(作为新层)。
  •   当pid 1退出时,
  • 环境变量,启动的守护程序和外壳状态都将与临时容器一起丢弃。

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

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

答案 2 :(得分:0)

我知道这是在不久前被问到的,但是在构建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 && pip install <package>

我认为scl命令在Dockerfile中运行时遇到问题,因为scl enable <package> bash将在您当前的shell中打开一个新的shell,而不是将软件包添加到当前shell中的路径中。

编辑:

Found,您可以通过运行以下命令将软件包添加到当前shell 中:

source scl_source enable <package>