docker - GitLab CI + Docker 容器和卷文件权限
问题描述
我正在使用 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
无权访问它们。因此,我有几个问题:
- 在容器内构建东西时有什么最佳实践吗?
- 有没有办法从容器内确保文件归主机上用户的用户 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: 原来这是我的语法错误。我将命令括在双引号中,但需要将其括在单引号中。
解决方案
推荐阅读
- java - Spring Boot Web 套接字中的实时通知
- ios - 如何在表格视图ios swift中获取谷歌地方自动完成预测中的选定地点坐标
- java - Tomcat 返回 http 状态错误:401,原因短语:未经授权
- java - 使用一台扫描仪在运行时显示可以同时保持和接受输入的多行
- ethereum - 当我添加一个简单的函数时,为什么我的 SmartContract 会耗尽燃料
- android - 如何添加 onclick imageview url 以及如何从 firebase 更新 url
- react-native - 带参数的反应导航
- sql - PostgreSQL 中的查询调优
- wordpress - Woocommerce 设置计费和运输信息
- xamarin.forms - Xamarin 表单,动态添加新项目到列表视图