问题
在执行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