【问题标题】:Dockerfile ADD tar.gz does not extract on ubuntu VM with DockerDockerfile ADD tar.gz 不会在带有 Docker 的 ubuntu VM 上提取
【发布时间】:2017-08-31 17:21:54
【问题描述】:

我有一个要构建的 Docker 映像,当我在 Windows 和 Mac Docker 上运行构建命令时,它可以正常工作并且可以正确构建,但是如果我在带有 docker 的 Ubuntu-Server VM 上运行相同的 Dockerfile-Build我收到一个错误。

我的 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-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(但下载有效)

你们有什么想法吗?

【问题讨论】:

    标签: linux ubuntu docker dockerfile tar


    【解决方案1】:

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

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


    编辑,尽量减少图像中的层数,我建议在 Dockerfile 中将下载、解包和清理作为单个 RUN 命令进行。例如。这是两个不同的 Dockerfile:

    $ 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
    

    【讨论】:

    • 好的,但我使用的是 17.06.1:$ docker --versionDocker version 17.06.1-ce, build 874a737
    • 或者你的意思是,自从版本 17.06.1 ADD 不再自动提取压缩包,我应该手动进行?或者你有什么推荐的?
    • 那是你的客户端还是服务器版本?如果它在当前版本中仍然存在问题,那么我会跟进他们的问题。
    • @cobz 为了清楚起见,这应该是您运行构建的服务器上的版本,而不是您尝试运行容器的位置或客户端版本。
    • @kbolino 如果您需要最终环境不包含构建映像所需的命令,您可以使用多阶段构建。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2023-03-26
    • 2014-11-24
    相关资源
    最近更新 更多