Docker 使用 Gitlab CI / CD 更新卷中的代码

Docker Update Code in Volume with Gitlab CI / CD

我正在学习docker,我刚遇到一个我无法解决的问题。

我想在我进行更改并推送它们时更新我的​​ docker 集群节点中的源代码。我只有一个索引 php,它回显 "Hello World" 并显示 phpinfo。我正在使用数据卷,因为它被推荐用于生产(为开发绑定装载)。

我的问题是:如何在使用卷时更新源代码?这种情况的最佳做法是什么?

目前,当我将更改推送到我的索引中的 gitlab 时 php 我的 gitlab-runner 会重新创建 Docker 图像并更新我的 swarm 服务。

这在我更改 Docker 文件中的 php 版本时有效,但 index.php 中的更改不会受到影响。

我的示例 Docker 文件如下所示。我只是将容器中的 index.php 复制到 /var/www/html,仅此而已。

当我第一次部署 swarm 堆栈时一切正常

FROM php:7.4.5-apache
# copy files
COPY src/index.php /var/www/html/
# apahe settings
RUN echo 'ServerName localhost' >> /etc/apache2/apache2.conf

我的 gitlab-ci.yml 看起来像这样

build docker image:
stage: build
 before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
 script:
  - docker build -t $CI_REGISTRY_IMAGE:latest .
  - docker push $CI_REGISTRY_IMAGE:latest
 tags:
  - build-image

deploy docker image:
 stage: deploy
 before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
 script:
  - docker service update --with-registry-auth --image $CI_REGISTRY_IMAGE:latest 
  $SWARM_SERVICE_NAME -d 
 tags:
  - deploy-stack

Docker 图像 通常包含应用程序的源代码和 运行 它所需的依赖项。 用于需要在底层应用程序发生更改时保留的持久数据。想象一个数据库:如果您从 somedb:1.2.3 升级到 somedb:1.2.4,您需要替换数据库应用程序二进制文件(在图像中),但需要保留实际的数据库内容(在卷中)。

尤其是在集群环境中,不要尝试将应用程序代码存储在卷中。如果您删除尝试此操作的部署设置部分,那么当容器使用更新的映像重新部署时,它们将看到更新的代码。