我有以下 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
為什么這不起作用并且我收到此錯誤?
docker:來自守護行程的錯誤回應:未能創建 shim:OCI 運行時創建失敗:container_linux.go:380:啟動容器行程導致:exec:“/bin/sh”:stat /bin/sh:沒有這樣的檔案或目錄:未知.
uj5u.com熱心網友回復:
使用入口點而不是 CMD
ENTRYPOINT ["/caddy"]
CMD ["file-server", "--browse", "--listen", "8080"]
還要注意 json 語法(exec 形式),這會導致事情不在子 shell 中運行。
與 shell 形式不同,exec 形式不呼叫命令 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 或運行命令列引數,但缺點是您的 ENTRYPOINT 將作為 /bin/sh -c 的子命令啟動,它不會傳遞信號。這意味著可執行檔案將不是容器的 PID 1 - 并且不會接收 Unix 信號 - 因此您的可執行檔案將不會收到來自 docker stop 的 SIGTERM 。
來源:https ://docs.docker.com/engine/reference/builder/#entrypoint
您的 PORT 仍會引起問題。考慮對其進行硬編碼。
uj5u.com熱心網友回復:
使用作為alpine輕量級影像的影像來運行 shell 命令并且它已/bin/sh加載到其中。
SCRATCH 映像基本上是空的,/檔案夾內沒有任何內容,因此沒有可執行檔案來執行作為 CMD 的一部分提供的任何內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/476091.html
