GitLab CI + Docker контейнер и права доступа к файлу тома - PullRequest
0 голосов
/ 03 октября 2018

Я запускаю конвейер с GitLab CI и настроил сервер с бегуном, следуя документации GitLab (https://docs.gitlab.com/runner/install/linux-manually.html, и https://docs.gitlab.com/runner/register/index.html).

Бегун настроенс исполнителем оболочки, а часть сценария устанавливает два контейнера Docker для сборки и обслуживания проекта.

Кажется, что все работает нормально, за исключением того, что пользователь gitlab-runner, кажется, перемещает или удаляет файлы между этапами,и это не работает после того, как процесс сборки создал файлы из контейнера Docker.

Файлы, созданные контейнером Docker, принадлежат пользователю в контейнере, и, таким образом, gitlab-runner не имеетдоступ к ним. Из-за этого у меня есть пара вопросов:

  1. Существуют ли передовые практики, когда речь идет о сборке вещей внутри контейнеров?
  2. Есть ли способ обеспечитьв контейнере, что файлы принадлежат идентификатору пользователя пользователя на хост-компьютере? (Я экспериментировал с установкой переменной среды для идентификатора пользователя gitlab-runner пользователь, но chown, похоже, плохо работает с переменными среды)

Если возможно, я бы хотел сохранить процесс сборки в контейнере.Я нашел бесчисленное множество статей и ответов на подобные вопросы, в которых делается вывод о предоставлении gitlab-runner прав пользователя root или аналогичных, и я не могу понять, как это можно рекомендовать или как это сделать правильно.

.gitlab-ci.yml

stages:
  - setup
  - testing
  - build

before_script:
  - export USERID=$(id | grep -Po '(?<=uid\=)(\d*)')

setup:
  stage: setup
  environment: development
  tags:
    - mytag
  only:
    - feature/gitlab-ci
    - development
    - master
  script:
    - cd docker
    - cp .env.prod.example .env
    - cp nginx-prod/.env.example nginx-prod/.env
    - cp node-prod/.env.example node-prod/.env
    - docker-compose -f docker-compose.prod.yaml build
    - docker-compose -f docker-compose.prod.yaml down
    - docker-compose -f docker-compose.prod.yaml up -d --force-recreate
    - docker exec nodejs_1 sh -c "cd /usr/src && npm i"
    - docker exec nodejs_1 sh -c "cd /usr/src && bower install"
    - docker exec nginx_1 sh -c "chown -R $CHOWNUID:$CHOWNUID /usr/share/nginx/html/bower_components"
    - docker exec nginx_1 sh -c "chown -R $CHOWNUID:$CHOWNUID /usr/share/nginx/html/node_modules"

testing:
  stage: testing
  environment: development
  tags:
    - mytag
  only:
    - feature/gitlab-ci
    - development
    - master
  script:
    - cd docker
    - 'echo "Running tests"'

build:
  stage: build
  environment: production
  tags:
    - mytag
  only:
    - feature/gitlab-ci
    - master
  when: manual
  script:
    - cd docker
    - docker exec nodejs_1 sh -c "cd /usr/src && grunt build"

docker-compose.prod.yaml

version: '3'
services:
  nginx:
    build: nginx-prod
    environment:
      - CHOWNUID=${USERID}
    env_file:
      - 'nginx-prod/.env'
    ports:
      - '90:80'
    volumes:
      - '..:/usr/share/nginx/html:cached'
      - './logs/nginx:/var/log/nginx:cached'
  nodejs:
    build: node-prod
    user: node
    environment:
      - CHOWNUID=${USERID}
    env_file:
      - 'node-prod/.env'
    tty: true
    volumes:
      - '..:/usr/src:cached'

Обновление 1: Похоже, что chown вфакт хорошо работает с переменными среды.У меня просто проблемы с запуском docker exec с переменной окружения, когда оболочка не думает, что она с хост-машины (она пытается разрешить переменную среды перед отправкой команды в контейнер).

Обновление 2: Оказывается, это была синтаксическая ошибка с моей стороны.Я заключил команду в двойные кавычки, но мне нужно было заключить ее в одинарные кавычки.

...