Dockerfile ADD tar.gz 不在 ubuntu 虚拟机上提取 Docker

Dockerfile ADD tar.gz does not extract on ubuntu VM with Docker

我有一个 Docker 我想构建的图像,当我 运行 在我的 Windows 和 Mac Docker 上构建命令时它有效很好并且构建正确,但是如果我 运行 在具有 docker 的 Ubuntu-Server VM 上构建相同的 Dockerfile-Build,我会收到错误消息。

我的 Docker 文件的关键部分是:

[...]
# 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-server VM 在 RUN mv go /usr/local/-step

失败

并产生以下错误:

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

而且我想它没有正确提取下载的 tar.gz(但下载有效)

你们有什么想法吗?

这是 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

17.06.01 的发行说明: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


编辑,尽量减少图像中的层数,我建议在 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