使用Gitlab CI CD在卷中更新Docker代码。

问题描述 投票:0回答:1

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

我想更新我的docker swarm节点中的源代码,当我做出改变并推送它们。我只是有一个index php,其中echos "Hello World "并显示phpinfo。我使用的是数据卷,因为它被推荐用于生产(绑定挂载用于开发)。

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

目前,当我在index php中推送修改到gitlab时,我的gitlab-runner会重新创建Docker镜像并更新我的swarm服务。

当我改变Dockerfile中的php版本时,这可以工作,但index.php中的变化不会受到影响。

我的Dockerfile例子是这样的。我只是把index.php复制到容器中的varwwwhtml,就这样。

当我第一次部署我的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 gitlab dockerfile docker-swarm gitlab-ci-runner
1个回答
0
投票

Docker 图像 通常包含应用程序的源代码和运行它所需的依赖关系。 用于需要在改变底层应用程序时保存的持久性数据。 想象一下一个数据库:如果你将数据库从原来的 somedb:1.2.3somedb:1.2.4你需要替换数据库应用程序二进制文件(在映像中),但需要保留实际的数据库内容(在卷中)。

特别是在集群环境中,不要尝试将你的应用程序代码存储在卷中。 如果你删除了部署设置中试图这样做的部分,那么当容器用更新的映像重新部署时,它们会看到更新的代码。

© www.soinside.com 2019 - 2024. All rights reserved.