Перейти к содержанию

▍GitLab Container Registry

GitLab Container Registry

Настройка GitLab Container Registry

В данном руководстве будем скрещивать наш собственный Docker Registry c GitLab, чтобы при пуше запускалась сборка Mkdocs, создание docker контейнера с файлами сайта и загрузка его в локальный Registry.

Для начала включим подсистему "GitLab Container Registry", которая по умолчанию отключена:

nano /etc/gitlab/gitlab.rb
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:

docker exec -it gitlab gitlab-ctl reconfigure

Добавим переменные в разделе "Настройки" -> "CI/CD" -> "Переменные"

GitLab CI Variable

где CI_REGISTRY - адрес нашего registry: https://registry.example.com

CI_REGISTRY_USER - логин от registry

CI_REGISTRY_PASSWORD - пароль от registry

DOCKER_AUTH_CONFIG:

{
        "auths": {
                "registry.example.com": {
                        "auth": "1111111111111111111111111=="
                }
        }
}

GitLab CI Variable

Осталось добавить в файл .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 * * * *"

то в скором времени автоматически подтянется обновлённый контейнер

К началу