我想在 Centos7 上的 Docker 容器中运行 Jenkins。 我看了Jenkins的官方文档: 首先,从 Docker 存储库中提取官方 jenkins 镜像。
docker pull jenkins
接下来,使用该镜像运行一个容器,并将数据目录从容器映射到主机;例如,在下面的示例中,容器中的 /var/jenkins_home 被映射到主机上当前路径的 jenkins/ 目录。 Jenkins 8080 端口也暴露给主机为 49001。
docker run -d -p 49001:8080 -v $PWD/jenkins:/var/jenkins_home -t jenkins
但是当我尝试运行 docker 容器时,出现以下错误:
/usr/local/bin/jenkins.sh: line 25: /var/jenkins_home/copy_reference_file.log: Permission denied
有人可以告诉我如何解决这个问题吗?
官方 Jenkins Docker 镜像文档关于卷的说明:
docker run -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins
这会将 jenkins 数据存储在主机上的 /your/home 中。确保容器中的 jenkins 用户(jenkins 用户 - uid 1000)可以访问 /your/home 或在 docker run 中使用 -u some_other_user 参数。
此信息也可在 Dockerfile 中找到。 因此,您需要做的就是确保目录
$PWD/jenkins
属于 UID 1000
:
mkdir jenkins
chown 1000 jenkins
docker run -d -p 49001:8080 -v $PWD/jenkins:/var/jenkins_home -t jenkins
最新的 Jenkins 文档说要使用 Docker“卷”。 Docker 在这方面有点棘手,两者之间的区别是带有用于绑定安装的 -v 选项的完整路径名,而只是卷的名称。
docker run -d -p 49001:8080 -v jenkins-data:/var/jenkins_home -t jenkins
此命令将创建一个名为“jenkins-data”的 docker 卷,您将不再看到错误。
您可以使用当前的 id 重建 jenkins 镜像:
FROM jenkins/jenkins as build
USER root
ARG uid=1003 # user id
ARG gid=1003 # group id
ENV USER=jenkins
ENV GROUP=jenkins
# Change userid and groupid
RUN usermod -u ${uid} ${USER} && groupmod -g ${gid} ${USER}
# Disable root login
RUN chsh -s /usr/sbin/nologin root
# Set default user login
USER jenkins
version: "3.6"
services:
jenkins:
build:
context: .
target: build
container_name: jenkins
ports:
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- "$PWD/data:/var/jenkins_home"
networks:
- net
networks:
net:
docker-compose up -d
docker exec -it jenkins bash -c 'cat $JENKINS_HOME/secrets/initialAdminPassword'