我正在尝试使用dockerfile构建映像。 dockerfile中的命令如下所示:
FROM ubuntu:16.04
:
:
RUN pip3 install virtualenvwrapper
RUN echo '# Python virtual environment wrapper' >> ~/.bashrc
RUN echo 'export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3' >> ~/.bashrc
RUN echo 'export WORKON_HOME=$HOME/.virtualenvs' >> ~/.bashrc
RUN echo 'source /usr/local/bin/virtualenvwrapper.sh' >> ~/.bashrc
这些命令之后,我将使用virtualenvwrapper命令创建一些virtualenvs。
如果在~/.bashrc
中只需要处理环境变量,则可以使用ARG
或ENV
进行设置。
但是现在我还有其他
virtualenvwrapper.sh
这样的shell脚本文件,它们将设置自己的一些变量。
此外,RUN source ~/.bashrc
不起作用(找不到源)。
我该怎么办?
答案 0 :(得分:1)
您不应尝试在Dockerfile中编辑诸如.bash_profile
之类的外壳点文件。有许多不通过外壳的常见路径(例如,CMD ["python", "myapp.py"]
不会启动任何类型的外壳,也不会读取.bash_profile
)。如果需要在映像中全局设置环境变量,请使用Dockerfile ENV
指令。
对于Python应用程序,您应该只使用pip install
将应用程序安装到映像的“全局” Python中。 You don't specifically need a virtual environment; Docker提供了许多相同的隔离功能(Dockerfile中的pip install
不会影响主机系统的全局安装软件包)。
一个典型的Python应用程序Dockerfile(从https://hub.docker.com/_/python/复制)看起来像
FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "./your-daemon-or-script.py"]
关于您的最后一个问题,source
是仅某些Shell提供的供应商扩展。 POSIX standard不需要它,而Debian和Ubuntu中的默认/bin/sh
不提供它。无论如何,由于环境变量会在每个RUN
命令上重置,因此如果RUN source ...
行中没有其他事件发生,则RUN . ...
(或更便于携带的RUN
)将是无操作的。
答案 1 :(得分:0)
RUN线路在环境方面是完全相互独立的