将 virtualenv 转换为 Docker 镜像

10
能否通过ADD命令将本地主机的虚拟环境数据传输到Docker镜像中?在容器内部进行pip安装,我更愿意用户在本地完成这些操作,然后将虚拟环境简单地转移到容器中。假设所有文件在本地和Docker容器中具有相同的名称,并且所有目录都正确嵌套,则可以实现此操作。如果能够将虚拟环境设置传输到Docker镜像中,则可以节省数分钟到数小时的时间。也许我的抽象思维不正确。但是,通过向容器传递requirements.txt文件执行pip installs相对于在本地完成这些操作来说效率非常低下,因为每次启动镜像时都需要重新安装未更改的相同依赖项。

我认为你误解了Docker构建的工作方式 - 它们不会在容器启动时发生。 - Oliver Charlesworth
2个回答

7
我们之前遇到过这个问题,以下是我们考虑的一些解决方案:
  1. 考虑构建已安装常见软件包的基础镜像。然后应用程序容器可以使用这些基础容器之一并安装差异部分。
  2. 在本地路径上缓存Pip软件包,并将其挂载到容器上。这将节省下载软件包的时间。
根据项目的复杂性,其中一个方法可能比另一个更适合 - 您还可以考虑混合方法以实现最大优化。

2

虽然可能,但不建议这样做。

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

为了仅在 requirements.txt 更改时触发 pip install,Dockerfile 应该这样开始:

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

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

如果您有多个具有相同依赖关系的容器,则可以使用所有依赖项构建中间映像,并从其中构建其他映像 FROM


然而,为了调试起见,当更改时是否有替代方法来构建和运行新的镜像呢?我的当前工作流程是对Docker进行编辑-> Docker构建-> Docker运行。每次都创建新的镜像,这显然是不好的做法,并且当安装每个构建的15个不同的requirements.txt文件时需要花费数小时。 - Baily
1
调试时,您可以使用 docker exec -it <container> /bin/bash 命令附加到容器并进行编辑,可能需要使用卷来处理源代码。 如果您有多个具有相同依赖项的容器,则可以构建包含所有依赖项的中间映像,并从中构建其他映像。 - Dmitry Platonov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接