【问题标题】:Docker VirtualenvDocker 虚拟环境
【发布时间】:2018-09-20 05:13:56
【问题描述】:

对于 Docker 等容器化应用程序,是否可以使用 virtualenv 使环境从构建过程一直运行到最终运行映像?似乎通过 pip 创建一个 virtualenv 并运行环境似乎永远不会起作用。

例如:

RUN pip3 install virtualenv
RUN virtualenv venv
RUN source venv/bin/activate

似乎永远不会呈现真正的虚拟环境,而以下 pip 安装将安装在该环境下。我需要或相信我需要此设置的原因是特定目录使用相邻目录的不同版本的依赖项:文件夹 B 使用 numpy 版本 X,而文件夹 C 使用 numpy 版本 Y。

对于 Docker,是否有我忘记的工具或功能允许我像虚拟环境一样使用 pip 安装,在不同目录中具有相同依赖项的不同版本?

【问题讨论】:

    标签: python docker pip virtualenv


    【解决方案1】:

    Docker RUN 是一个构建步骤。它在之前创建了一个新层,并且本质上创建了一个新图像。所以你的问题的答案是“否”。

    考虑使用ENTRYPOINT 和/或CMD,或为方便起见编写启动脚本。

    编写您的RUN 脚本可能也适合您的需要:RUN my_deploy_for_venv.sh 将在一层中执行,因此如果您在脚本中启动venv,您将在其执行期间拥有它。不过,您必须在容器启动时再次启动它。

    【讨论】:

      【解决方案2】:

      这可能会有所帮助。您只需要弄清楚如何使用 CMD 或入口点启动它。但这是我能走多远:

      FROM ubuntu:xenial
      
      RUN mkdir -p /usr/python-app
      WORKDIR /usr/python-app
      
      RUN apt-get update \
          && apt-get install -y python3-pip
      
      RUN pip3 install virtualenv    
      
      RUN virtualenv foo-env -p python3
      
      
      
      COPY ./ /usr/python-app
      RUN /bin/bash -c 'source /usr/python-app/foo-env/bin/activate'
      
      
      
      CMD ["entry.sh"]
      
      EXPOSE 8080
      

      然后你就可以用这样的方式运行它了:

      docker run -d -p 8000:8000 --name python-env-container python-env-container
      

      您可以使用以下命令在容器中打开一个外壳:

      docker exec -it <container id you can get it from docker ps> bash
      

      让我知道这是否有帮助?

      【讨论】:

      • 顺便说一句,您使用以下代码构建它:$ docker build -t python-env-container .
      猜你喜欢
      • 2020-11-19
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      相关资源
      最近更新 更多