我在 DevOps 方面没有太多经验,而且我在 Jenkins 中需要完成的任务有点困难。
我们正在开发一个 API,该 API 构建为在 Jenkins 中作为 Docker 容器运行,该容器在远程构建服务器上运行。我了解到,从安全角度来看,以 root 身份运行 Docker 容器通常是不好的做法,因此我已将用户添加到 Dockerfile
中,以解决此问题:
# Use internal user rather than root
RUN groupadd -r app && useradd -r -g app -s /bin/bash user
...
USER user
CMD ["/bin/bash", "/start.sh"]
我认为这对于安全方面来说没有问题,但是在 Jenkins 中运行容器会产生一些意想不到的问题。在我们用于 API 的 Jenkinsfile 中,在构建映像后,它是这样启动的(在将用户添加到 Dockerfile
之后,最初它以 root 身份运行):
stage('Run tests against Docker image') {
...set up stages e.g. build docker image
agent {
docker {
image "${DOCKER_IMAGE_NAME_ADMIN}:${DOCKER_IMAGE_TAG}"
args "--user=user:app" // This was originally --user=root
}
}
...
stages {
stage('Copy secrets file') {
steps { sh 'cd ${APP_DIR} && cp server/config/environment/secrets.ci.js server/config/environment/secrets.js' }
}
...stages where tests are run
最初 user
尝试执行 cp
命令时存在写入权限问题,但通过 chmod
中的 dockerfile
解决了这个问题。但是,现在在同一阶段存在一个问题,即用户和写入 Jenkins 日志的权限(取自 Jenkins 控制台输出):
touch: cannot touch '/var/lib/jenkins/workspace/app_name_PR-852@2@tmp/durable-0ab9d0ab/jenkins-log.txt': Permission denied
有没有什么办法可以让创建的用户获得这样做的权限,而不必以 root 身份运行容器?