为什么从Dockerfile构build图像时,git clone会失败?

FROM ansible/ansible:ubuntu1604 MAINTAINER myname RUN git clone http://github.com/ansible/ansible.git /tmp/ansible RUN git clone http://github.com/othertest.git /tmp/othertest WORKDIR /tmp/ansible ENV PATH /tmp/ansible/bin:/sbin:/usr/sbin:/usr/bin:bin ENV PYTHONPATH /tmp/ansible/lib:$PYTHON_PATH ADD inventory /etc/ansible/hosts WORKDIR /tmp/ EXPOSE 8888 

当我从这个dockerfilebuild立起来的时候,我把克隆插入/ tmp / ansible和其他的红色文本(我认为是错误的)。 当我然后运行容器并仔细阅读时,我发现从dockerfile的所有步骤都正确构build,而不是缺less的git存储库。

我弄不清楚我做错了什么,我假设它是一个简单的错误。

build设docker文件:

 sudo docker build --no-cache -f Dockerfile . 

运行dockerfile:

 sudo docker run -I -t de32490234 /bin/bash 

简短的回答:

把你的文件放在/tmp以外的地方,事情应该可以正常工作。

更长的答案:

你是基于你的形象在ansible/ansible:ubuntu1604图像。 如果你通过docker inspect ansible/ansible:ubuntu1604检查这个图像, docker inspect ansible/ansible:ubuntu1604或者查看Docker文件 ,你会发现它包含了一些卷挂载。 Dockerfile的相关行是:

 VOLUME /sys/fs/cgroup /run/lock /run /tmp 

这意味着所有这些目录都是卷装入点,这意味着放入它们的任何数据都不会作为图像构build过程的一部分提交。

看着你的Dockerfile ,我有两条与上面无关的评论:

  • 你明确地设置了PATH环境variables,但是你忽略了包含/bin ,这会导致各种问题,比如:

     $ docker run -it --rm bash docker: Error response from daemon: oci runtime error: exec: "bash": executable file not found in $PATH. 
  • 你使用了两次WORKDIR ,但是第一次( WORKDIR /tmp/ansible )你实际上没有任何关心你目录的事情(你只是设置一些环境variables并把文件复制到/etc/ansible )。