У меня проблемы с веб-сервером, который периодически обновляется и встраивается в образ докера. Весь этот процесс происходит на машине, где веб обновляется и разворачивается, и все это с помощью сценария 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).
Поскольку все выполняется в gitlab-runner, то есть на машине, на которой размещен веб-сервер, обратите внимание, что этап развертывания в основном состоит из запуска образа, созданного ранее. Я думаю, что этот шаг может быть значительно улучшен, но не могу понять, как.
Это всегда работает в первый раз, когда нет никакого образа докера, запускаемого и обслуживающего Интернет.
Теперь,по поводу вопроса. Мы хотим, чтобы сервер еженедельно обновлялся через 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: устройство или ресурс занят
Я полагаю, потому что запущен процесс докера (веб-сервер). Тем не менее, я не могу (я полагаю) обрезать или выполнять процессы rm из конвейера, так как конвейер сам является образом докера и может прерваться. В любом случае, я начинаю чувствовать, что этот способ обновления сервера слишком запутан и должен быть лучшим способом сделать это. Есть идеи или предложения?