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

时间:2018-09-12 09:13:27

标签: docker dockerfile

我正在重新使用带有以下内容的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为什么需要在文件上添加时间戳,或者为什么这样做是个好习惯?

1 个答案:

答案 0 :(得分:2)

由于Docker层缓存,在许多常见情况下,touch命令不会执行任何操作。如果jar文件已更改,则ADD命令会将其包含在图像中,并带有来自主机的最后修改时间(“分别复制along with its metadata”);因为大概是最近的,所以touch命令会在几秒钟后将其更新。如果jar文件没有更改,则Docker将跳过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"]