【发布时间】:2019-05-05 10:34:15
【问题描述】:
我正在尝试将 Go Web 服务器创建为小型 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 和临时镜像,这是一个特殊的空的 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"
如何解决?谢谢!
【问题讨论】:
-
@A.R,我运行
docker没有问题。问题是获得干净的图像只包含 Go 应用程序本身,而没有 Go 构建环境。有了它,我运行docker就没有问题了,它的最后一个命令是CMD ["go", "run", "main.go"]