2017-08-31 156 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