▍GitLab Container Registry¶
Настройка GitLab Container Registry¶
В данном руководстве будем скрещивать наш собственный Docker Registry c GitLab, чтобы при пуше запускалась сборка Mkdocs, создание docker контейнера с файлами сайта и загрузка его в локальный Registry.
Для начала включим подсистему "GitLab Container Registry", которая по умолчанию отключена:
registry_external_url 'https://registry.example.com'
gitlab_rails['registry_enabled'] = true
registry['enable'] = true
registry_nginx['enable'] = true
registry_nginx['proxy_set_headers'] = {
"Host" => "$http_host",
"X-Real-IP" => "$remote_addr",
"X-Forwarded-For" => "$proxy_add_x_forwarded_for",
"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on"
}
registry_nginx['listen_https'] = false
Запускаем перенастройку GitLab:
Добавим переменные в разделе "Настройки" -> "CI/CD" -> "Переменные"
где CI_REGISTRY - адрес нашего registry: https://registry.example.com
CI_REGISTRY_USER - логин от registry
CI_REGISTRY_PASSWORD - пароль от registry
DOCKER_AUTH_CONFIG:
Осталось добавить в файл .gitlab-ci.yml следующие правила сборки:
stages:
- build
- docker_push
build_docs_job:
stage: build
tags: [mkdocs]
only:
- /^master$/
- merge_requests
image:
name: registry.example.com/mkdocs
entrypoint: [""]
script:
- 'mkdocs build --site-dir site'
artifacts:
name: "site_$($CI_PIPELINE_IID)"
paths:
- site
docker_push:
stage: docker_push
tags: [mkdocs]
image: docker
only:
- /^master$/
before_script:
- (if [ -d "site" ]; then echo ok; else exit "no build folder, try to run pipeline again"; fi);
# Такая конструкция нужна, чтобы не было ошибки "WARNING! Using --password via the CLI is insecure. Use --password-stdin."
- echo "$CI_REGISTRY_PASSWORD" docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin
# Такая конструкция нужна, чтобы не было ошибки "no basic auth credentials"
- mkdir /root/.docker && echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
script:
- docker build --no-cache -f Dockerfile -t registry.example.com/blog:latest .
- docker push registry.example.com/blog:latest
- docker logout $CI_REGISTRY
Чтобы команда docker build прошла корректно нужно в конфиге gitlab-runner прокинуть сокет докера /var/run/docker.sock:/var/run/docker.sock, в итоге это будет выглядеть примерно так:
Теперь в директории нашего проекта с MkDocs добавим файл Dockerfile c необходимым наш содержимым, например, соберём контейнер с nginx и файлами MkDocs:
FROM nginx:alpine
# Configure nginx
COPY docker/config/nginx.conf /etc/nginx/nginx.conf
COPY docker/config/conf.d /etc/nginx/conf.d
COPY docker/config/sites-enabled/ /etc/nginx/sites-enabled
# Setup document root
RUN mkdir -p /www
# Make sure files/folders needed by the processes are accessable when they run under the nobody user
RUN chown -R nobody.nobody /www && \
chown -R nobody.nobody /run && \
chown -R nobody.nobody /var/cache/nginx && \
chown -R nobody.nobody /var/log/nginx
# Switch to use a non-root user from here on
USER nobody
# Add application
WORKDIR /www
COPY --chown=nobody site/ /www/example.com
# Expose the port nginx is reachable on
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]
Теперь если на стороннем сервере настроен watchtower с параметром:
WATCHTOWER_SCHEDULE: "*/5 * * * *"
то в скором времени автоматически подтянется обновлённый контейнер