2017-08-31 157 views
1

我有一个Docker Image,我想要构建它,并且在Windows和Mac Docker上运行构建命令时它工作正常并且构建正确,但是如果我运行相同的Dockerfile - 使用docker在Ubuntu服务器虚拟机上构建我遇到错误。Dockerfile ADD tar.gz不能在具有Docker的Ubuntu VM上提取

我Dockerfile的关键部分是:

[...] 
# Dependencies 
RUN apt-get update && apt-get install -y apt-utils curl git tar gzip 
# Install Go 
ENV GO_VERSION 1.8 
WORKDIR /tmp 
ADD https://storage.googleapis.com/golang/go$GO_VERSION.linux-amd64.tar.gz ./ 
RUN mv go /usr/local/ 
[...] 

但是,Ubuntu的服务器虚拟机是未能在RUN mv go /usr/local/ - 工序

并产生以下错误:

Step 10/24 : RUN mv go /usr/local/ 
---> Running in 6b79a20769eb 
mv: cannot stat ‘go’: No such file or directory 

我想它不会正确提取下载的tar.gz(但下载工作)

你们有什么想法吗?

回答

2

这是17.06的一个已知问题,并在17.06.1中进行了修补。记录的行为是下载tgz,但从远程URL拔出时不能解压缩。自动解包tgz是17.06年的一个意外的行为改变,他们在17.06.1恢复到只下载tgz。

为17.06发行说明(见上面的说明):https://github.com/docker/docker-ce/releases/tag/v17.06.0-ce

为01年6月17日发行说明:https://github.com/docker/docker-ce/releases/tag/v17.06.1-ce

问题:https://github.com/moby/moby/issues/33849

PR修复:https://github.com/docker/docker-ce/pull/89


编辑,尽量减少图像中的层数,我建议下载,un打包和清理作为Dockerfile中的单个RUN命令。例如。这里有两个不同的Dockerfiles:

$ cat df.tgz-add 
FROM busybox:latest 
ENV GO_VERSION 1.8 
WORKDIR /tmp 

ADD https://storage.googleapis.com/golang/go$GO_VERSION.linux-amd64.tar.gz ./ 
RUN tar -xzf go$GO_VERSION.linux-amd64.tar.gz \ 
&& rm go$GO_VERSION.linux-amd64.tar.gz 

CMD ls -l . 

$ cat df.tgz-curl 
FROM busybox:latest 
ENV GO_VERSION 1.8 
WORKDIR /tmp 

RUN wget -O go$GO_VERSION.linux-amd64.tar.gz https://storage.googleapis.com/golang/go$GO_VERSION.linux-amd64.tar.gz \ 
&& tar -xzf go$GO_VERSION.linux-amd64.tar.gz \ 
&& rm go$GO_VERSION.linux-amd64.tar.gz 

CMD ls -l . 

生成的输出这里截断......

$ docker build -t test-tgz-add -f df.tgz-add . 
... 

$ docker build -t test-tgz-curl -f df.tgz-curl . 
... 

他们同样运行:

$ docker run -it --rm test-tgz-add 
total 4 
drwxr-xr-x 11 root  root   4096 Aug 31 20:27 go 

$ docker run -it --rm test-tgz-curl 
total 4 
drwxr-xr-x 11 root  root   4096 Aug 31 20:29 go 

然而,做一个RUN下载,编译,并且清理可以节省您从图层历史记录中下载的80MB:

$ docker images | grep test-tgz 
test-tgz-curl    latest          2776133659af  30 seconds ago  269MB 
test-tgz-add    latest          d625455998ff  2 minutes ago  359MB 
+0

好吧,但我使用17.06.1: '$ docker --version''Docker version 17.06.1-ce,build 874a737' – cobz

+0

或者你的意思是说,自17.06.1版本以来,ADD并没有提取tarballs不再自动,我应该手动做? 或者你有什么建议? – cobz

+0

是你的客户端还是服务器版本?如果它在当前版本中仍然存在问题,那么我会跟进他们的问题。 – BMitch