Dockerfile中的`touch`有什么作用?

问题描述 投票:1回答:1

我正在重新使用这些内容的Dockerfile

ADD dist /dist/
ARG JAR_FILE
ADD target/${JAR_FILE} /target/app.jar
RUN sh -c 'touch /target/app.jar'
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java -jar /target/app.jar"]

我理解除touch之外的所有线条。 This site说:

RUN sh -c ‘touch /app.jar’ - 触摸我们的文件以便它有修改时间(Docker默认创建所有容器文件处于“未修改”状态)

我知道触摸文件会更改其修改日期。为什么Docker需要文件的时间戳,或者为什么这样做是一个好习惯?

docker dockerfile
1个回答
2
投票

由于Docker层缓存,在很多常见情况下,touch命令不会做任何事情。如果jar文件已更改,则ADD命令会将其包含在图像中,并在主机中显示其最后修改时间(“它是单独复制的along with its metadata”);因为大概是最近,touch命令会将它更新到几秒钟之后。如果jar文件没有更改,那么Doc​​ker将跳过ADD和RUN命令,并使用上一次运行它时的文件系统输出,以及之前运行的时间戳。

如果jar文件只是用作java -jar的输入,那么它的最后修改时间也不应该与任何东西相关。

我猜你可以安全地删除没有不良影响的touch命令。有一些不必要的sh -c调用无关紧要,只是杂乱无章。我猜这个Dockerfile在功能上是等价的:

# Prefer COPY to ADD, unless you explicitly want Docker to fetch
# URLs or unpack archives
COPY dist /dist/
ARG JAR_FILE
COPY target/${JAR_FILE} /target/app.jar
EXPOSE 8080
# Prefer CMD to ENTRYPOINT, if nothing else so `docker run imagename sh` works
# Split simple commands into words yourself
CMD ["java", "-jar", "/target/app.jar"]
© www.soinside.com 2019 - 2024. All rights reserved.