Имеется простое приложение на flask, работает в docker контейнере, разработка ведется в репозитории gitlab. Было решено максимально упростить процесс выката изменений на «продакшн». Сделал коммит, запушил, а далее все автоматически (ci должен собрать образ, залить его в registry, подключится к docker на «продакшн» сервере и обновить контейнер.
Сразу покажу gitlab-ci.yml
image: docker:18.09.7 services: - docker:18.09.7-dind stages: - build - deploy before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY build: only: - pushes stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA - docker push $CI_REGISTRY_IMAGE:latest deploy: only: - pushes stage: deploy before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - cp $DOCKER_CACERT ~/.docker/ca.pem && cp $DOCKER_CERT ~/.docker/cert.pem && cp $DOCKER_KEY ~/.docker/key.pem - export DOCKER_HOST=tcp://MYSERVER.COM:2376 DOCKER_TLS_VERIFY=1 - docker stop $CI_PROJECT_NAME || true - docker rm $CI_PROJECT_NAME || true - docker rmi $CI_REGISTRY_IMAGE:latest - docker pull $CI_REGISTRY_IMAGE:latest script: - docker run --name $CI_PROJECT_NAME -d -p 127.0.0.1:5000:5000 --restart unless-stopped -e DATABASE_URL="$DATABASE_URL" -e SECRET_KEY=$SECRET_KEY -e GOOGLE_OAUTH_CLIENT_ID=$GOOGLE_OAUTH_CLIENT_ID -e GOOGLE_OAUTH_CLIENT_SECRET=$GOOGLE_OAUTH_CLIENT_SECRET -e SENTRY_ENV=$SENTRY_ENV -e SENTRY_DSN="$SENTRY_DSN" $CI_REGISTRY_IMAGE:latest
Важные моменты по файлу.
- В before_script мы авторизируемся в локальном image registry
- only: pushes (сборка и деплой триггерится пушем в репозиторий, иначе если вы запушите 10 коммитов у вас запустится 10 процессов сборки)
- В секции deploy->before_script снова авторизируемся, но уже на нашем «продакшн» сервере при помощи сертификатов, которые должны быть добавлены как переменные (тип: file, 3 переменных: $DOCKER_CACERT (содержимое ca.pem), $DOCKER_CERT (содержимое client.pem), $DOCKER_KEY (содержимое cclient.key)) в настройках репозитория. Как включить удаленный доступ и сгенерировать сертификаты для docker я писал здесь.
- Измените строку «DOCKER_HOST=tcp://MYSERVER.COM:2376» на корректный адрес удаленного docker сервера и порт api.
- В секции script происходит запуск контейнера из только-что собранного image, с необходимыми для вашего приложения переменными окружения, измените их в соответствии с требованиями вашего софта.
Добрый день
Подскажите пожалуйста, с чем это связано?
Executing «step_script» stage of the job script
00:00
Using docker image sha256:51453dcdd9bd51e503f75e6d42a4071469ad2ba816321781985041b6bc7776db for docker:latest with digest docker@sha256:ddf0d732dcbc3e2087836e06e50cc97e21bfb002a49c7d0fe767f6c31e01d65f …
$ docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest .
invalid argument «:06868bc0» for «-t, —tag» flag: invalid reference format
See ‘docker build —help’.
Cleaning up file based variables
00:01
ERROR: Job failed: exit code 125
в gitlab-ci.yml:
publish:
image: docker:latest
stage: publish
services:
— docker:dind
script:
— docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest .
— docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
— docker push $CI_REGISTRY_IMAGE:latest