首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头从无到有CMD缺陷

码头从无到有CMD缺陷
EN

Stack Overflow用户
提问于 2022-05-14 19:35:53
回答 2查看 282关注 0票数 0

我有下面的Dockerfile

代码语言:javascript
复制
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:没有这样的文件或目录:未知。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-14 19:51:58

使用入口点代替CMD

代码语言:javascript
复制
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

你的港口仍然会引起问题。考虑对其进行硬编码。

票数 3
EN

Stack Overflow用户

发布于 2022-05-14 19:42:53

使用一个alpine映像,它是一个轻量级的映像来运行shell命令,并在其中加载了/bin/sh

抓取映像基本上是空的,在/文件夹中没有任何内容,因此没有任何可执行文件来执行作为CMD一部分提供的任何内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72243358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档