docker 生产代码构建
docker production code build
当使用 docker 创建生产构建时,人们使用什么策略来编译和捆绑代码。
所以在 docker 世界之外,我会创建一个构建(使用某种 npm 命令),它将创建一个 dist。代码(没有任何源代码,例如经过加粗和压缩 javascript),然后我将 Web 服务器指向 dist 文件夹。
在 docker 世界中,您将在哪里构建代码,是在 docker 图像中还是在 host os 中,只需将 dist 文件夹复制到docker 图片?基本上我不想要整个 npm_modules 和 docker image/container 中的所有源代码文件。
知道如何实现吗?
谢谢
在 Docker 中,一般来说,您希望创建一个软件映像,其中包含您的应用程序在任何机器上 运行 所需的一切。这就是 Docker 的用途:将应用程序及其依赖项绑定到一个工件中,以便它可以 运行 在安装 Docker 的任何地方。
当您使用像 Docker swarm 这样的编排器时,自给自足的图像非常方便。编排器可以 运行 任何机器上的容器,该容器是 网络 的一部分(即集群),方法是拉取映像并启动容器。如果主机和镜像都没有包含它需要的所有内容,那么容器就会失败。
在某些情况下,您需要非常轻松地更改容器内的文件,因为它 运行s,例如在开发中。在这种情况下,您将本地目录从主机挂载到容器中(参见 volumes);通过这种方式,您只需修改主机中的文件,并且修改会立即在容器内传播。即使在这种情况下,您的图像也应该包含 运行 其他机器上的应用程序所需的文件;使用卷只是将它们隐藏在开发环境中。
听起来您担心两个不同的有效问题:
- 确保 isolated/reproducible 生产环境。
- 确保 isolated/reproducible 构建环境(对于构建 #1)。
您可以使用您建议的方法实现这两个目标 - 将构建步骤 运行 作为 Dockerfile
的一部分。但这有您提到的缺点 - 您在 运行 时会留下所有 source/development 工件,除非您采取明确的步骤将它们全部删除。
Docker 引入了 multi-stage builds 以在一定程度上缓解这个问题 - 它有效地允许您将 "squash" 多层合二为一。但它并没有消除需要显式清理的问题。
所以根据我的经验,最常见的解决方案确实是在外部构建您的工件,然后 COPY
将其放入您的生产映像中。
这解决了问题 #1,但没有解决问题 #2。因此,更进一步 - 在 Docker 容器中构建您的 Docker 图像! CI 平台越来越多地支持这种方法作为第一个 class 概念 - 参见例如Circle CI's Docker executor.
当使用 docker 创建生产构建时,人们使用什么策略来编译和捆绑代码。
所以在 docker 世界之外,我会创建一个构建(使用某种 npm 命令),它将创建一个 dist。代码(没有任何源代码,例如经过加粗和压缩 javascript),然后我将 Web 服务器指向 dist 文件夹。
在 docker 世界中,您将在哪里构建代码,是在 docker 图像中还是在 host os 中,只需将 dist 文件夹复制到docker 图片?基本上我不想要整个 npm_modules 和 docker image/container 中的所有源代码文件。
知道如何实现吗?
谢谢
在 Docker 中,一般来说,您希望创建一个软件映像,其中包含您的应用程序在任何机器上 运行 所需的一切。这就是 Docker 的用途:将应用程序及其依赖项绑定到一个工件中,以便它可以 运行 在安装 Docker 的任何地方。
当您使用像 Docker swarm 这样的编排器时,自给自足的图像非常方便。编排器可以 运行 任何机器上的容器,该容器是 网络 的一部分(即集群),方法是拉取映像并启动容器。如果主机和镜像都没有包含它需要的所有内容,那么容器就会失败。
在某些情况下,您需要非常轻松地更改容器内的文件,因为它 运行s,例如在开发中。在这种情况下,您将本地目录从主机挂载到容器中(参见 volumes);通过这种方式,您只需修改主机中的文件,并且修改会立即在容器内传播。即使在这种情况下,您的图像也应该包含 运行 其他机器上的应用程序所需的文件;使用卷只是将它们隐藏在开发环境中。
听起来您担心两个不同的有效问题:
- 确保 isolated/reproducible 生产环境。
- 确保 isolated/reproducible 构建环境(对于构建 #1)。
您可以使用您建议的方法实现这两个目标 - 将构建步骤 运行 作为 Dockerfile
的一部分。但这有您提到的缺点 - 您在 运行 时会留下所有 source/development 工件,除非您采取明确的步骤将它们全部删除。
Docker 引入了 multi-stage builds 以在一定程度上缓解这个问题 - 它有效地允许您将 "squash" 多层合二为一。但它并没有消除需要显式清理的问题。
所以根据我的经验,最常见的解决方案确实是在外部构建您的工件,然后 COPY
将其放入您的生产映像中。
这解决了问题 #1,但没有解决问题 #2。因此,更进一步 - 在 Docker 容器中构建您的 Docker 图像! CI 平台越来越多地支持这种方法作为第一个 class 概念 - 参见例如Circle CI's Docker executor.