使用Gitlab CI / CD批量发布Docker更新代码

时间:2020-05-15 10:32:33

标签: docker gitlab dockerfile docker-swarm gitlab-ci-runner

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

当我进行更改并推送它们时,我想更新docker swarm节点中的源代码。我只有一个索引php,它回显“ Hello World”并显示phpinfo。自从建议将其用于生产以来,我一直在使用数据卷(对于dev而言是绑定安装)。

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

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

当我更改Dockerfile中的php版本但index.php中的更改不会受到影响时,此方法有效。

我的示例Dockerfile看起来像这样。我只是将index.php复制到容器中的/ var / www / html而已。

当我第一次部署集群时,一切正常

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

1 个答案:

答案 0 :(得分:0)

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

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