gpt4 book ai didi

docker - 在 Docker 中构建干净的 Go 应用程序

转载 作者:IT王子 更新时间:2023-10-29 01:48:52 28 4
gpt4 key购买 nike

我正在尝试将 Go 网络服务器创建到小型 Docker 镜像中。理想情况下,干净的图像只包含 Go 应用程序本身(可能支持 Web 组件,但不包含 Go 构建环境)。

这是我的 Dockerfile:

# golang:latest as build-env
FROM golang:latest AS build-env

RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN cd /app && GO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
# go build -o myapp

FROM scratch
COPY --from=build-env /app/myapp /app/images /

EXPOSE 8080
ENTRYPOINT /myapp

它使用 Docker Builder Pattern 和 scratch 镜像,这是一个特殊的空 docker 镜像。

它构建正常,但是当我运行它时,我得到:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown.

更新:

所以ENTRYPOINT需要改成exec形式:

ENTRYPOINT ["/myapp"]

完成后,我收到一个新错误:

standard_init_linux.go:207: exec user process caused "no such file or directory"

使用占用空间小的 Linux 镜像作为基础(即 Alpine Linux)而不是从头开始也无济于事:

$ docker run -it -p 8080:8080 go-web-docker-small            
standard_init_linux.go:207: exec user process caused "no such file or directory"

$ docker run -it -p 8080:8080 go-web-docker-small /bin/sh -i
standard_init_linux.go:207: exec user process caused "no such file or directory"

如何解决?谢谢!

最佳答案

Dockerfile 的最后一行是

ENTRYPOINT /myapp

有两种形式的 ENTRYPOINT(以及 CMD 和 RUN)指令。一个"exec form"看起来像一个 JSON 列表,并提供一个未解释的参数列表以作为主容器进程运行。 "shell form"看起来不像 JSON 列表,并且隐式包装在 /bin/sh -c '...' 中。

您的 ENTRYPOINT 使用 shell 形式,而 FROM scratch 图像没有 shell,从而产生您得到的错误。您可以将其更改为执行形式

ENTRYPOINT ["/myapp"]

关于docker - 在 Docker 中构建干净的 Go 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55985562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com