首页 > 解决方案 > 如何在 docker 卷中复制源代码构建

问题描述

我已经阅读了 docker 文档和许多文章,但不知何故无法理解标准 rpocedure ,我如何在下面实现。我有一个使用 docker compose 创建的 docker 卷,这个 docker 卷挂载到容器中的 /var/www/myapp。现在我构建代码并想要替换它。我正在使用以下命令,它工作正常。

sudo docker cp ./broker/ ai:/var/www/myapp/

还有其他方法吗?我可以在 docker 卷上复制它自己,它会工作吗?可以有多个盒子,我不想在每个盒子上都运行这个命令。

标签: dockerdocker-compose

解决方案


您应该将源代码构建到图像中。如果您打算在多个系统上运行相同的映像,则更是如此:如果您的应用程序构建在一个独立的映像中,您可以只docker push将映像存储到注册表并docker pull在另一个系统上运行,您就完成了. 不要在源代码中使用卷。

here$ docker build -t registry.example.com/me/image .
here$ docker push registry.example.com/me/image

there$ docker pull registry.example.com/me/image
there$ docker run -d -p 8888:80 registry.example.com/me/image

这里的“注册表”可以是您自己运行的东西、您的云提供商提供的东西(AWS ECR、Google GCR、...)或 Docker Hub(省略registry.example.com部分)。

如果您的应用程序发生更改,请在本地构建并运行其单元测试,然后重复上述docker build顺序以构建新映像。您还可以将持续集成系统设置为在您提交到源存储库时自动执行此操作。每次构建使用唯一标签是一种很好的做法,例如日期戳或源代码管理 ID;如果您始终如一地这样做,那么docker run ...image:20200706.01如果需要,它将拉出一个新图像。

卷用于数据,并且本质上是它们运行的​​系统的本地。如果您已绑定挂载主机目录,则可以将scp其绑定到另一个系统;如果您使用的是命名卷复制,则要困难得多。如果您尝试将应用程序源代码与 Docker 映像分开复制,那么您将错过 Docker 的主要优势之一。

这意味着,在本地环境中,您还应该避免将代码绑定安装到容器中。我已经看到几个 SO 问题,其中绑定挂载以某种方式与图像中的内容不一致(一个在子目录中,一个不在;一个有一个本地包树,另一个没有维护;...)所以你可以很容易地得到一个图像“但它在我的系统上工作”......你错过了 Docker 的主要优势之一。

(如果您将 Kubernetes 视为一个长期部署系统,则非常需要一个注册表;每个构建一个唯一的标签是一个非常好的主意;并且模拟 Docker 主机绑定挂载的机制与其他系统一样复杂Kubernetes 部署系统。)


推荐阅读