我遇到了一个Web服务器的问题,该Web服务器会定期更新并内置到Docker映像中。所有这些过程都是在gitlab-ci.yml
脚本的更新和部署的机器上进行的,该脚本也在该maxchine(配置为gitlab-runner)中执行。顺便说一句,第一次运行时一切正常,但是在更新映像时开始失败。我将在下面更详细地说明这一点。
以下.gitlab-ci.yml
包含有关如何构建和部署服务器(应用程序)的说明。
.gitlab-ciyml
image: docker:19.03.0
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
DOCKER_IMAGE: user/app:latest
services:
- docker:19.03.0-dind
before_script:
- docker info
stages:
- build
- deploy
build:
stage: build
script:
- docker login -u user -p $PASSWORD
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
only:
- master
tags:
- build_app
deploy:
stage: deploy
script:
- docker ps -a -q --filter ancestor="app:latest" --format="{{.ID}}" | xargs --no-run-if-empty docker rm -f
- docker run -p 80:80 $DOCKER_IMAGE &
only:
- master
tags:
- deploy_app
因此,将要服务于该网站的机器首先构建一个docker映像,并在此过程中更新Web的内容(这是通过从dockerfile中调用脚本来完成的。)
由于所有内容都在gitlab-runner中运行,也就是托管Web服务器的机器,因此请注意,部署阶段基本上由先前构建的正在运行的docker映像组成。我想此步骤可以大大改善,但无法找出方法。
当没有运行任何docker镜像并为网络提供服务时,这总是第一次起作用。
现在,关于这个问题。我们希望通过fcrontab每周更新服务器,并启动与上述相同的管道。只需再次触发管道即可完成此操作:
curl -X POST -F token=mytoken -F ref=master https://gitlab.com/api/v4/projects/......./trigger/pipeline
但是这次会显示错误:
在/var/lib/docker/overlay2/bla...bla/merged上创建覆盖挂载时出错:设备或资源繁忙
我想是因为有一个正在运行的docker进程(Web服务器)。但是,我无法(我想)从管道中修剪或rm进程,因为管道本身就是docker映像,并且可能会中断。无论如何,我开始觉得这种更新服务器的方式太令人困惑了,应该是实现此目的的更好方法。有什么想法或建议吗?