所以google已经使我失败了,所以我希望大家能有所启发。
我正在尝试使用Docker创建一个自定义Jenkins Dockerfile,并对其配置进行设置,以使我们可以在不同项目中使用“预烘焙” Jenkins设置。
每当我尝试使用COPY命令将config.xml复制到/ var / jenkins_home / jobs文件夹中时,它只是不执行此操作。它没有显示错误,当我登录到容器中或检查主机服务器上的卷存储(位于/ var / jenkins_home / jobs相同位置)时,它并不存在。
我的猜测是,这与jenkins映像中的WORKDIR有关,但我不是Docker方面的专家。我可以将config.xml添加到主机服务器上的卷中,并且工作正常,但是我想要一个可以使用的映像。
我在下面粘贴了Dockerfile,我从/ opt / jenkins_config中的目录运行它:
FROM jenkins/jenkins:lts
## Change to root user
USER root
## Name the jobs
ARG job_name_1=Generate-Key
ARG job_name_2=Generate-Stack
## Create the job workspaces
RUN mkdir -p "$JENKINS_HOME"/workspace/${job_name_1}
RUN mkdir -p "$JENKINS_HOME"/workspace/${job_name_2}
## Create the jobs folder recursively
RUN mkdir -p "$JENKINS_HOME"/jobs/${job_name_1}
RUN mkdir -p "$JENKINS_HOME"/jobs/${job_name_2}
RUN ls -ltr "$JENKINS_HOME"/jobs/
## Add the custom configs to the container
COPY configs/${job_name_1}/config.xml "$JENKINS_HOME"/jobs/${job_name_1}/config.xml
COPY configs/${job_name_2}/config.xml "$JENKINS_HOME"/jobs/${job_name_2}/config.xml
## Create build file structure
RUN mkdir -p "$JENKINS_HOME"/jobs/${job_name_1}/latest/
RUN mkdir -p "$JENKINS_HOME"/jobs/${job_name_1}/builds/1/
## Create build file structure
RUN mkdir -p "$JENKINS_HOME"/jobs/${job_name_2}/latest/
RUN mkdir -p "$JENKINS_HOME"/jobs/${job_name_2}/builds/1/
## Change ownership to jenkins user
RUN chown ${uid}:${gid} $JENKINS_HOME
答案 0 :(得分:0)
根据您的情况,COPY configs/${job_name_1}/config.xml "$JENKINS_HOME"/jobs/${job_name_1}/config.xml
将被翻译为下一个:
COPY /opt/jenkins_config/configs/Generate-Key/config.xml /var/jenkins_home/jobs/Generate-Key/config.xml
接下来您要说的
当我检查主机服务器上的卷存储时(位于/ var / jenkins_home / jobs相同的位置)。
因此,当我docker run
定义一个绑定安装时,如下所示:
-v /var/jenkins_home/jobs:/var/jenkins_home/jobs
如果上述情况与您的情况相同,那么事情会清除:
docker build
时,config.xml
已成功复制到位置为/var/jenkins_home/jobs/Generate-Key/config.xml
的图像,因此您肯定不会出错。
当您执行docker run
时会发生问题,-v /var/jenkins_home/jobs:/var/jenkins_home/jobs
不会将容器中的内容弹出到主机,它只会将主机上的文件夹安装到容器中,这意味着主机文件夹将覆盖同一文件夹在容器中,因此先前复制到图像的config.xml
被空的主机文件夹覆盖。因此,您什么也看不到,可以在不定义-v
和exec的情况下进行验证来进行检查。