我想用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 :帮助您找到完整的点。怎么了?
答案 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>