问题

在执行docker history查看 image 镜像出现类似的信息:

<missing>      6 days ago    ENV NGINX_PKG=/usr/local/nginx                  0B        buildkit.dockerfile.v0
<missing>      7 weeks ago   /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B        
<missing>      7 weeks ago   /bin/sh -c #(nop) ADD file:aa183dc07d0f6a47c…   7.35MB

发现在一些层中有/bin/sh -c #(nop)。这是什么呢?

解决

NOP代表“无操作”。

Docker为每一层“运行一个shell”。Dockerfile中除RUN命令外(例如ENV、COPY、ADD等)的所有docker命令(或层)在历史记录中都显示为空或注释掉的shell命令。#符号标记注释的开始,之后的任何内容都将被/bin/sh跳过。

非RUN命令不需要由shell解释,而是由docker内部处理。

如果之前运行过相同的命令,层缓存可以使用历史记录(包括非RUN命令)跳过处理。例如,当使用COPY --from=...来从一个不同的构建阶段复制文件时,Docker需要一个空操作来标记这个层,即使实际上并没有执行任何命令。

当看到"#(nop)"时,它通常表示那一层没有进行任何修改,或者是为了保持构建过程中的某些逻辑而添加的。这个注释是Docker自动生成的,用来帮助用户理解镜像构建过程中的每个步骤。

参考:
https://stackoverflow.com/questions/41298934/what-does-nop-mean-in-docker-history
https://forums.docker.com/t/what-is-nop-and-where-does-it-come-from/32665