我有下面的Dockerfile
FROM golang as builder
ARG CADDY_HASH=4b4e99bdb2e327d553a5f773f827f624181714af
WORKDIR /root/caddy
RUN wget -qO- github.com/caddyserver/caddy/archive/"$CADDY_HASH".tar.gz | tar zx --strip-components=1
RUN set -e; cd cmd/caddy && CGO_ENABLED=0 go build
FROM scratch
COPY --from=builder /root/caddy/cmd/caddy/caddy /
ARG PORT=8000
ENV PORT $PORT
EXPOSE $PORT
CMD /caddy file-server --browse --listen :$PORT我使用以下命令构建和运行
DOCKER_BUILDKIT=0 docker build -t caddy-static-docker:latest . && docker run -e PORT=8000 -p 8000:8000 caddy-static-docker:latest
为什么这个不能工作,而我收到了这个错误?
停靠:来自守护进程的错误响应:未能创建shim: OCI运行时创建失败: container_linux.go:380:启动容器进程导致: exec:"/bin/sh":stat /bin/sh:没有这样的文件或目录:未知。
发布于 2022-05-14 19:51:58
使用入口点代替CMD
ENTRYPOINT ["/caddy"]
CMD ["file-server", "--browse", "--listen", "8080"]还请注意json语法(exec表单),这将导致子subshell中没有运行的内容。
与shell窗体不同的是,
表单不调用命令shell。这意味着正常的shell处理不会发生。例如,CMD "echo“、" $HOME”不会在$HOME上执行变量替换。如果您想要shell处理,那么要么使用shell表单,要么直接执行shell,例如: CMD "sh“、"-c”、"echo $HOME“。当使用exec表单并直接执行shell时(就像对shell表单的情况一样),执行环境变量扩展的是shell,而不是docker。
来源:https://docs.docker.com/engine/reference/builder/#cmd
shell表单防止使用任何CMD或运行命令行参数,但其缺点是您的入口点将作为/bin/sh -c的子命令启动,它不会传递信号。这意味着可执行文件将不是容器的PID 1,也不会接收Unix信号,因此您的可执行文件将不会从停靠站接收SIGTERM。
来源:https://docs.docker.com/engine/reference/builder/#entrypoint
你的港口仍然会引起问题。考虑对其进行硬编码。
发布于 2022-05-14 19:42:53
使用一个alpine映像,它是一个轻量级的映像来运行shell命令,并在其中加载了/bin/sh。
抓取映像基本上是空的,在/文件夹中没有任何内容,因此没有任何可执行文件来执行作为CMD一部分提供的任何内容。
https://stackoverflow.com/questions/72243358
复制相似问题