Как правильно развернуть докер веб-сервер с помощью файлов .gitlab-ci.yml - PullRequest
0 голосов
/ 14 октября 2019

У меня проблемы с веб-сервером, который периодически обновляется и встраивается в образ докера. Весь этот процесс происходит на машине, где веб обновляется и разворачивается, и все это с помощью сценария 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 из конвейера, так как конвейер сам является образом докера и может прерваться. В любом случае, я начинаю чувствовать, что этот способ обновления сервера слишком запутан и должен быть лучшим способом сделать это. Есть идеи или предложения?

...