我正在使用GitLab CI运行管道,并且已经按照GitLab的文档(https://docs.gitlab.com/runner/install/linux-manually.html和https://docs.gitlab.com/runner/register/index.html)设置了带有运行程序的服务器。
运行程序由shell执行程序设置,脚本的一部分设置了两个Docker容器来构建和服务项目。
除了gitlab-runner
用户似乎在各个阶段之间移动或删除文件外,一切似乎都可以正常工作,并且在构建过程从Docker容器内创建文件之后,此操作不起作用。
由Docker容器创建的文件归容器中的用户所有,因此gitlab-runner
无权访问它们。因此,我有几个问题:
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: 原来这是我的语法错误。我将命令括在双引号中,但需要将其括在单引号中。