首页 > 解决方案 > GitLab CI + Docker 容器和卷文件权限

问题描述

我正在使用 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 所有?(我已经尝试将环境变量设置为用户的用户 ID 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使用环境变量运行时遇到问题,而 shell 没有从主机考虑它(它会在将命令发送到容器之前尝试解析环境变量)。

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

标签: dockergitlabgitlab-cigitlab-ci-runnerchown

解决方案


推荐阅读