如何使用.gitlab-ci.yml文件正确部署Docker Web服务器

时间:2019-10-14 10:49:10

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

我遇到了一个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映像,并且可能会中断。无论如何,我开始觉得这种更新服务器的方式太令人困惑了,应该是实现此目的的更好方法。有什么想法或建议吗?

0 个答案:

没有答案