GitLab CI + Docker容器和卷文件权限

时间:2018-10-02 22:03:59

标签: docker gitlab gitlab-ci gitlab-ci-runner chown

我正在使用GitLab CI运行管道,并且已经按照GitLab的文档(https://docs.gitlab.com/runner/install/linux-manually.htmlhttps://docs.gitlab.com/runner/register/index.html)设置了带有运行程序的服务器。

运行程序由shell执行程序设置,脚本的一部分设置了两个Docker容器来构建和服务项目。

除了gitlab-runner用户似乎在各个阶段之间移动或删除文件外,一切似乎都可以正常工作,并且在构建过程从Docker容器内创建文件之后,此操作不起作用。

由Docker容器创建的文件归容器中的用户所有,因此gitlab-runner无权访问它们。因此,我有几个问题:

  1. 在容器内构建东西时是否有最佳实践?
  2. 是否可以从容器内部确保文件由主机上用户的用户ID拥有? (我已经尝试过将环境变量设置为gitlab-runner用户的用户ID,但是chown似乎不适用于环境变量)

如果可能的话,我想将构建过程保留在容器内。 我发现了无数的文章和类似问题的答案,其结论是给予gitlab-runner用户root权限或类似权限,但我看不出如何建议这样做或正确的方法。< / p>

.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时遇到了问题,而shell没有从主机上考虑它(它试图在将命令发送到容器之前解析环境变量)。

更新2: 原来这是我的语法错误。我将命令括在双引号中,但需要将其括在单引号中。

0 个答案:

没有答案