问题描述
在使用Docker构建和运行Jenkins容器时,希望能够通过自定义的UID和GID来运行。他在构建Docker镜像时使用了--build-arg uid=1003 --build-arg gid=1003
参数,但是在运行Jenkins容器后发现UID和GID并未生效。他想知道为什么会出现这种情况。
解决方案
请注意以下操作可能因版本差异而有所变化,建议在操作前备份数据和镜像。
方案解析
用户在构建Docker镜像时指定了--build-arg uid=1003 --build-arg gid=1003
参数,但是在运行Jenkins容器后,UID和GID并没有生效。原因在于Docker的FROM
命令与镜像的构建方式有关。解决这个问题的方法取决于你是否需要自定义UID和GID以及是否愿意使用自定义的Dockerfile。
方案1:使用Git Repo URL构建
如果你想在构建Jenkins容器时指定自定义的UID和GID,可以考虑使用Git仓库URL进行构建。下面是一个示例命令:
docker build -t my-jenkins --build-arg uid=1003 --build-arg gid=1003 https://github.com/jenkinsci/docker.git
docker run -it -p 8080:8080 --rm my-jenkins
在上述示例中,我们使用了Git仓库的URL来构建Jenkins容器,并在构建过程中指定了自定义的UID和GID参数。
方案2:自定义Dockerfile
如果你需要对Jenkins镜像进行更多的自定义,并且希望使用自定义的UID和GID,可以考虑编写自己的Dockerfile。在Dockerfile中,你可以更改Jenkins用户的UID和GID,以便在容器运行时生效。下面是一个示例Dockerfile:
FROM jenkins/jenkins:latest
ARG uid=1003
ARG gid=1003
USER root
RUN groupmod -g $gid jenkins && usermod -u $uid -g $gid jenkins
USER jenkins
在上述示例中,我们首先基于jenkins/jenkins:latest
镜像构建,然后使用ARG
指令定义了uid和gid的默认值为1003。接着,我们切换到root
用户,修改jenkins用户的gid和uid,然后切换回jenkins
用户。
请注意,这个方法需要你自己编写Dockerfile,但它可以确保自定义的UID和GID在容器中生效。
总结
Docker的FROM
命令不会递归构建镜像,因此在构建基于已有镜像的镜像时,基础镜像的--build-arg
参数不会生效。如果你需要在构建和运行Jenkins容器时指定自定义的UID和GID,可以考虑使用Git Repo URL进行构建,或者编写自定义的Dockerfile来修改UID和GID。