在Dockerfile中解压gz文件

6

我有一个如下的目录结构。

- app
  Dockerfile
   - target
     - test_app.tar.gz

解压tar.gz文件将会有以下内容:
- lib
- conf
- bin

我想从docker镜像中提取并添加lib/*文件夹。
FROM docker.hub.com/alpine/jdk1.8:latest  

RUN mkdir -p /service \
            /service/app_lib \
            /service/lib

COPY target/test_app.tar.gz /service/app_lib/
RUN cd  /service/app_lib/ 
RUN tar -xzf test_app.tar.gz
RUN rm test_app.tar.gz
RUN cd lib
COPY * /service/lib/
RUN rm app_lib

使用此代码时出现以下错误。
Step 5/11 : RUN tar -xzf test_app.tar.gz
 ---> Running in edde27a1cc60
tar (child): test_app.tar.gz: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

不确定这是哪里出了问题。

2个回答

42

ADD指令将在构建时自动解压缩.gz文件。

ADD target/test_app.tar.gz /service/app_lib
# Clean up
RUN rm -rf /service/app_lib/conf \
           /service/app_lib/bin

5
听起来非常酷,但似乎对我不起作用。我正在运行 Docker v18.03.1-ce-mac65(在 Mac 上)。看起来我需要自己解压缩。 - Tom
@Tom,这是相当新的Docker版本。如果您不确定是否遗漏了什么,请查看ADD文档https://docs.docker.com/engine/reference/builder/#add。另外,请尝试验证<src>路径以获取tar.gz文件和.dockerignore以忽略构建上下文中的文件。 - Michal Svorc
Mac Docker 版本为 18.09.2,构建版本号为 6247962,使用 .gz 文件安装也无法正常工作。 - maraujop
文档说明它将检查文件的魔数/头部,而不是扩展名来决定是解包还是仅复制文件。请确保您正在测试的是一个tar归档文件。 - stacksonstacks
4
请注意,自动解压仅适用于本地 .gz 文件,而不适用于从远程源获取的文件。(我当时在尝试使用 GitHub 的发布版本。) - tomgsmith99

11
RUN cd命令的效果仅在该行中持续存在,在下一行,您回到了/,因此找不到文件。请使用WORKDIR代替RUN cd ...,这样它就可以按照您的期望工作。 或者您可以将整个内容放入单个RUN命令中。
RUN cd /service/app_lib/ && tar -xzf test_app.tar.gz && rm test_app.tar.gz

对于下一个 RUN cd lib 部分同样适用。

https://docs.docker.com/engine/reference/builder/#workdir


1
请参考@stacksonstacks的答案:https://dev59.com/9q3la4cB1Zd3GeqPVf7j#52069435,了解ADD命令。无需使用COPY > tar -x > rm。 - Michal Svorc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接