我正在尝试使用CentOS 7作为基础镜像在docker容器中运行python3应用程序。因此,如果我只是交互地使用它,我输入scl enable rh-python36 bash
这显然将我的标准python2环境切换到了我之前安装的python3.6环境(在dockerfile中),现在,在dockerfile的前面,我运行了以下命令:
SHELL ["scl", "enable", "rh-python36"] (以及它的许多变体)
这使我能够在这个python3环境中执行所有的pip安装。然而,当我真的想用CMD运行我的app.py时,它默认使用python2。我尝试过使用入口点和CMD的变体,但似乎无法在容器最终运行时激活python3环境。我怎样才能在python3中正确运行它呢?
这是dockerfile:
FROM centos:7
RUN mkdir -p /usr/src/app && \
yum install -y centos-release-scl && \
yum install -y rh-python36 && \
yum install -y rh-python36-python-tkinter
SHELL ["scl", "enable", "rh-python36"]
WORKDIR /usr/src/app
COPY . .
WORKDIR /usr/src/app/codeBase
RUN pip install --no-cache-dir -r /usr/src/app/codeBase/requirements.txt
EXPOSE 9000
CMD ["python", "run.py"]我也尝试过别名解决方案,但恐怕它不会更改CMD的python exe :以下是完全可运行的版本,它仍然可以打印出python 2.7.5:
FROM centos:7
RUN mkdir -p /usr/src/app && \
yum install -y centos-release-scl && \
yum install -y rh-python36 && \
yum install -y rh-python36-python-tkinter
WORKDIR /usr/src/app
RUN alias python=$(find / -type f -name "python*" | grep "python3.6$")
CMD ["python", "-V"]这一切似乎都不会在使用CMD创建的新shell中持久存在
发布于 2019-06-04 05:52:57
注意:
我将这个答案作为问题的上下文,但这并不能解决问题。我的尝试是修改python所指向的位置,但是如果在RUN命令中执行,shell将退出,并且您将丢失alias。根据this question,通过bash修改PYTHONPATH也是行不通的。感谢@tripleee的接球
不幸的是,看起来yum install -y rh-python36把python3.6放在了一个非常奇怪的位置:
find / -type f -name "python*" | grep "python3.6$"
/opt/rh/rh-python36/root/usr/bin/python3.6您可以使用该命令在Dockerfile中alias您的python命令
RUN mkdir -p /usr/src/app && \
yum install -y centos-release-scl && \
yum install -y rh-python36 && \
yum install -y rh-python36-python-tkinter
# Here
RUN alias python=$(find / -type f -name "python*" | grep "python3.6$")这应该允许您保留CMD并将其绑定到正确的site-packages
import sys
sys.path
['', '/opt/rh/rh-python36/root/usr/lib64/python36.zip', '/opt/rh/rh-python36/root/usr/lib64/python3.6', '/opt/rh/rh-python36/root/usr/lib64/python3.6/lib-dynload', '/opt/rh/rh-python36/root/usr/lib64/python3.6/site-packages', '/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages']看起来这也可能会消除对python环境的scl enable需求,因为您可以只使用python -m pip...
# No scl has been run
python -m pip install requests# running python in the terminal
import requests
r = requests.get('http://google.com')
# runs like a charm发布于 2019-06-04 23:19:23
对于这一点,SHELL是完全错误的Dockerfile命令。您可能希望将其放入RUN节中。
SHELL的用途是定义用于执行RUN命令的外壳。所以就像这样
SHELL ["sh", "-c"] # The default
RUN echo "foo"最后跑起来了
sh -c 'echo "foo"'当然,用不支持此用例的命令替换SHELL只会破坏RUN命令。
也许可以试试这样的东西
FROM centos:7
RUN mkdir -p /usr/src/app && \
yum install -y centos-release-scl && \
yum install -y rh-python36 && \
yum install -y rh-python36-python-tkinter
WORKDIR /usr/src/app
COPY . .
WORKDIR /usr/src/app/codeBase
RUN scl enable rh-python36 pip install --no-cache-dir -r ./requirements.txt
EXPOSE 9000
CMD ["scl", "enable", "rh-python36", "python", "run.py"]发布于 2019-06-04 23:32:33
多亏了C.Nivs的回答和here的回答,我才弄明白了这一点。别名在交互式shell中有效,但不适用于CMD。我最终所做的与此类似,只是在我的示例中,我在/usr/bin中创建了一个新的可执行文件,该文件调用特殊的python36 exe:
RUN echo -e '#!/bin/bash\n$(find / -type f -name "python*" | grep "python3.6$") "$@"' > /usr/bin/py3 && \
chmod +x /usr/bin/py3
CMD ["py3", "-V"]现在,py3专门使用任何参数运行调用python3安装的脚本
https://stackoverflow.com/questions/56434820
复制相似问题