我正在重复使用Dockerfile包含以下内容的 a :
ADD dist /dist/\nARG JAR_FILE\nADD target/${JAR_FILE} /target/app.jar\nRUN sh -c \'touch /target/app.jar\'\nEXPOSE 8080\nENTRYPOINT ["sh", "-c", "java -jar /target/app.jar"]\nRun Code Online (Sandbox Code Playgroud)\n\n我理解除带有 的那一行之外的所有行touch。这个网站说:
\n\n\n\n
RUN sh -c \xe2\x80\x98touch /app.jar\xe2\x80\x99\xe2\x80\x93 触摸我们的文件,使其具有修改时间(Docker 默认情况下以 \xe2\x80\x9cunmodified\xe2\x80\x9d 状态创建所有容器文件)
我知道触摸文件会更改其修改日期。为什么 Docker 需要文件上的时间戳,或者为什么这样做是一个好习惯?
\n由于 Docker 层缓存,在很多常见情况下该touch命令不会执行任何操作。如果 jar 文件已更改,则 ADD 命令会将其包含在映像中以及来自主机的上次修改时间(“它与其元数据一起单独复制”);因为这大概是最近的事,所以该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"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14111 次 |
| 最近记录: |