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
我有一个 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