在Dockerfile中提取gz

use*_*872 0 docker dockerfile

我有一个目录结构如下.

- app
  Dockerfile
   - target
     - test_app.tar.gz
Run Code Online (Sandbox Code Playgroud)

tar.gz的提取将具有以下内容,

- lib
- conf
- bin
Run Code Online (Sandbox Code Playgroud)

我想提取并添加lib/*文件夹到docker镜像.

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
Run Code Online (Sandbox Code Playgroud)

得到以下错误.

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
Run Code Online (Sandbox Code Playgroud)

不知道这有什么问题.

sta*_*cks 13

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

ADD target/test_app.tar.gz /service/app_lib
# Clean up
RUN rm -rf /service/app_lib/conf \
           /service/app_lib/bin
Run Code Online (Sandbox Code Playgroud)

  • 这听起来超级酷,但似乎对我不起作用。运行 Docker v18.03.1-ce-mac65 (24312)(在 Mac 上,obv)。看来我需要解压自己了。 (4认同)
  • 另请注意,自动解包仅适用于本地 .gz 文件,而不适用于从远程源获取的文件。(我试图使用 github 版本。) (4认同)

Pro*_*yag 11

RUN cd命令的效果仅对该单行有效,在下一行,您又回到了 中/,因此无法找到该文件。使用WORKDIR而不是,RUN cd ...它应该按您的预期工作。或者你可以把整个事情放到一个RUN命令中,比如

RUN cd /service/app_lib/ && tar -xzf test_app.tar.gz && rm test_app.tar.gz
Run Code Online (Sandbox Code Playgroud)

同样的事情适用于下RUN cd lib一部分。

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