Docker运行命令未应用于图像

时间:2018-05-03 12:54:08

标签: docker dockerfile

我有一个Dockerfile如下:

FROM jenkins/jenkins:2.119

USER jenkins
ENV HOME /var/jenkins_home

COPY --chown=jenkins:jenkins ssh ${HOME}/.ssh/

RUN chmod 700 ${HOME}/.ssh && \
    chmod 600 ${HOME}/.ssh/*

ssh目录在构建机器上的目录/文件中有755/644。但是,当我用

构建时
docker build -t my/temp .

并使用ls命令启动图像

docker run -it --rm my/temp ls -la /var/jenkins_home/.ssh

两个chmod命令都没有应用于图像

drwxr-xr-x 2 jenkins jenkins 4096 May  3 12:46 .
drwxr-xr-x 4 jenkins jenkins 4096 May  3 12:46 ..
-rw-r--r-- 1 jenkins jenkins  391 May  3 11:42 known_hosts

在构建期间,我看到了

Step 4/6 : COPY --chown=jenkins:jenkins ssh ${HOME}/.ssh/
 ---> 58e0d8242fac
Step 5/6 : RUN chmod 700 ${HOME}/.ssh &&     chmod 600 ${HOME}/.ssh/*
 ---> Running in 0c805d4d4252
Removing intermediate container 0c805d4d4252
 ---> bbfc828ace79

看起来chmod被丢弃了。我该如何阻止这种情况发生?

我在Mac OSX上使用最新的Docker(Edge) 版本18.05.0-ce-rc1-mac63(24246);边缘3b5a9a44cd

修改

使用--rm也不起作用(删除图像和重建后)但没有删除消息

docker build -t my/temp --rm=false .

run -it --rm my/temp ls -la /var/jenkins_home/.ssh
drwxr-xr-x 2 jenkins jenkins 4096 May  3 15:42 .
drwxr-xr-x 4 jenkins jenkins 4096 May  3 15:42 ..
-rw-r--r-- 1 jenkins jenkins  391 May  3 11:42 known_hosts

编辑2

所以基本上是Docker中的一个错误,其中带有VOLUME的基本映像导致chmod失败,同样地,卷上的RUN mkdir失败但COPY失败了,但是使用了错误的权限离开了目录。感谢bkconrad

编辑3

在此处使用修复程序创建了分叉https://github.com/systematicmethods/jenkins-docker build.sh将在本地构建一个图像

2 个答案:

答案 0 :(得分:1)

这与Docker处理图像VOLUME的方式有关。

来自docker inspect my/temp

"Volumes": {
  "/var/jenkins_home": {}
},

有一个关于moby项目的有用票据:

https://github.com/moby/moby/issues/12779

基本上,您需要在运行时执行chmod

HOME envvar设置为非/tmp的非卷路径会显示预期的行为:

$ docker run -it --rm my/temp ls -la /tmp/.ssh
total 8
drwx------ 2 jenkins jenkins 4096 May  3 17:31 .
drwxrwxrwt 6 root    root    4096 May  3 17:31 ..
-rw------- 1 jenkins jenkins    0 May  3 17:24 dummy

答案 1 :(得分:0)

Step 5/6 : RUN chmod 700 ${HOME}/.ssh &&     chmod 600 ${HOME}/.ssh/*
 ---> Running in 0c805d4d4252

Removing intermediate container 0c805d4d4252

正如你所看到的那样"中间容器"正在被移除,这是码头工人保持的正常行为,如果你想将这些用途保留在命令之下。

docker build -t my/temp --rm=false .

其中一篇文章也解释过它

Why docker build image from docker file will create container when build exit incorrectly?