【问题标题】:Transfer virtualenv to docker image将 virtualenv 传输到 docker 映像
【发布时间】:2018-08-23 13:19:17
【问题描述】:

是否可以通过 ADD 命令将虚拟环境数据从本地主机传输到 docker 映像?

与其在容器内进行 pip 安装,我更希望用户在本地完成所有这些工作,然后简单地将虚拟环境转移到容器中。授予所有文件在本地与 docker 容器中的名称相同,并且所有目录都正确嵌套。

如果可以将虚拟环境设置传输到 docker 映像中,这将节省几分钟到几小时。也许我在错误的摘要中考虑这个问题。

通过传递到容器的 requirements.txt 进行 pip 安装感觉非常低效,而不是在本地完成,否则每次启动映像时,它都必须重新安装相同的依赖项不会从每个图像的构建中更改。

【问题讨论】:

  • 我认为您误解了 Docker 构建的工作方式 - 它们不会在容器启动时发生。

标签: python docker pip virtualenv dockerfile


【解决方案1】:

虽然可能,但不推荐。

  • 依赖项(库版本、全局安装的包)在主机和容器上可能不同。
  • 映像构建不会 100% 在其他主机上重现。
  • pip install 的影响不大。每个 RUN 命令都会创建自己的层,这些层会缓存在本地和存储库中,因此 pip install 只有在 requirements.txt 更改(或重建之前的层)时才会重新运行。

要仅在 requirements.txt 更改时触发 pip install,Dockerfile 应该以这种方式启动:

... COPY requirements.txt ./ RUN pip install -r requirements.txt COPY src/ ./ ...

另外,它只会在镜像构建时运行,而不是容器启动。

如果您有多个具有相同依赖项的容器,您可以使用所有依赖项构建中间镜像并构建其他镜像FROM它。

【讨论】:

  • 但是,为了调试,当事情发生变化时,是否有替代构建和运行新映像的方法?我目前的工作流程是对 docker -> docker build -> docker run 进行编辑。每次创建新图像,这显然是一种不好的做法,并且每次构建安装 15 个不同的 requirements.txt 文件时需要数小时。
  • 对于调试,您可以使用docker exec -it <container> /bin/bash 附加到您的容器并进行编辑,可能使用音量作为源。如果您有多个具有相同依赖项的容器,您可以构建具有所有依赖项的中间镜像并构建其他镜像FROM it。
【解决方案2】:

我们之前遇到过这个问题,以下是我们考虑的几件事:

  1. 考虑构建安装了通用软件包的基础映像。然后,应用程序容器可以使用这些基本容器之一并安装差异。
  2. Cache the Pip packages 在可以安装在容器上的本地路径上。这将节省下载软件包的时间。

根据您项目的复杂性,一个可能比另一个更适合 - 您也可以考虑采用混合方法来找到最大优化。

【讨论】:

    猜你喜欢
    • 2022-10-27
    • 2015-10-19
    • 2022-07-05
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2021-11-06
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多