无法读取 Dockerfile 命令:是否可以 cd 到 jar 文件中? tar -cf 做什么?

Trouble reading Dockerfile commands: Is it possible to cd into a jar file? and what does tar -cf do?

我有以下 Dockerfile:

FROM openjdk:8

ENV AJSC_HOME=/opt/att/ajsc
ENV AJSC_CONFIG_HOME=${AJSC_HOME}/config

COPY startService.sh /startService.sh
RUN chmod 777 /startService.sh && dos2unix /startService.sh

ADD @project.build.finalName@-@assembly.id@.tar.gz app.jar

ADD prometheus-java-agent.jar monitoring.jar
ADD ilib.jar ilib.jar

RUN (cd app.jar/@project.build.finalName@;tar -cf - src) | (cd ../..;tar -xf -) \
&& (cd app.jar/@project.build.finalName@;tar -cf - opt/att/ajsc/lib) | (cd ../..;tar -xf -) \
&& (cd app.jar/@project.build.finalName@;tar -cf - opt/att/ajsc/config) | (cd ../..;tar -xf -)
RUN (mv monitoring.jar opt/att/ajsc/lib)
RUN (mv ilib.jar opt/att/ajsc/lib)
RUN (rm -rf app.jar)

ENTRYPOINT /startService.sh

除了以下几行,我理解此文件中的所有内容:

RUN (cd app.jar/@project.build.finalName@;tar -cf - src) | (cd ../..;tar -xf -) \
&& (cd app.jar/@project.build.finalName@;tar -cf - opt/att/ajsc/lib) | (cd ../..;tar -xf -) \
&& (cd app.jar/@project.build.finalName@;tar -cf - opt/att/ajsc/config) | (cd ../..;tar -xf -)

那三行是干什么的?看起来某些目录只是被复制到 docker 图像中的特定目录,但为什么 "untar" 而不是简单地使用 COPY 命令?

在标题中你问一下cd放入一个jar。这行不通,至少在典型的 UNIX shell 中是这样。所以它很可能是一个名为 app.jar 的目录,而不是一个 jar 文件。顺序

tar -cf - dir-to-pack | (cd otherdir; tar -xf -)

确实是一个保留文件模式的递归复制操作。对于设备文件、软链接、硬链接等特殊情况,可能与仅使用 cp -a 存在一些差异,但它们是真正有意还是偶然取决于准备 cp -a 的人的手艺=18=] 图片.