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
,您需要替换数据库应用程序二进制文件(在图像中),但需要保留实际的数据库内容(在卷中)。
尤其是在集群环境中,不要尝试将应用程序代码存储在卷中。如果您删除尝试此操作的部署设置部分,那么当容器使用更新的映像重新部署时,它们将看到更新的代码。
我正在学习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
,您需要替换数据库应用程序二进制文件(在图像中),但需要保留实际的数据库内容(在卷中)。
尤其是在集群环境中,不要尝试将应用程序代码存储在卷中。如果您删除尝试此操作的部署设置部分,那么当容器使用更新的映像重新部署时,它们将看到更新的代码。