我想了解CMD和ENTRYPOINT的工作原理。因此,我刚刚创建了一个非常简单的Dockerfile
FROM scratch
CMD echo "Hello First"
ENTRYPOINT echo "Hello second"
然后我构建此图像:
docker build -t my_image .
日志如下:
第1/3步:从头开始--->第2/3步:CMD回显“ Hello First” ---> 使用缓存---> 9f2b6a00982f步骤3/3:ENTRYPOINT echo“ Hello 秒” --->使用缓存---> 1bbe520f9526成功构建 1bbe520f9526已成功标记my_image:最新安全警告:您 正在针对非Windows Docker从Windows构建Docker映像 主办。所有添加到构建上下文的文件和目录都将具有 '-rwxr-xr-x'权限。建议仔细检查并重设 敏感文件和目录的权限。
当我创建此图像的容器时,它返回:
docker run my_image
错误是:
docker:来自守护程序的错误响应:OCI运行时创建失败: container_linux.go:344:启动容器过程引起的“ exec: \“ / bin / sh \”:stat / b in / sh:没有这样的文件或目录“:未知。
有人可以帮助我解决错误吗?
答案 0 :(得分:6)
这里发生了两件事。
以FROM scratch
开头的Dockerfile从根本没有任何内容的基础映像开始。它是完全空的。除了Docker为您提供的几个设备文件之外,没有一组基础工具或库或其他任何东西。
Docker将ENTRYPOINT echo ...
命令重写为ENTRYPOINT ["/bin/sh", "-c", "echo ..."]
,并导致CMD
被完全忽略。除非被docker run --entrypoint
覆盖,否则它将成为容器运行的主要过程。
由于它是FROM scratch
图像,并且根本不包含任何内容,因此它不包含外壳程序,因此出现“ / bin / sh:无此类文件或目录”错误。
答案 1 :(得分:0)
我解决了一个类似的问题,用一个删除所有Docker镜像
docker rmi -f $(docker images -aq)
并重新启动Docker。
另一个选项是通过Docker桌面仪表板将其重置为出厂默认值。请注意,这将删除您的所有图像,容器,设置等。