Docker多阶段构建的问题

Docker多阶段构建的问题,docker,dockerfile,Docker,Dockerfile,我对多阶段构建有一个问题,即在第一阶段构建的二进制文件被正确复制到第二阶段,但是当您尝试运行它时,无法找到可执行文件 dockerfile是: FROM golang as goimage ENV SRC=/go/src/ RUN mkdir -p /go/src/ WORKDIR /go/src/go_docker RUN git clone https://github.com/bryonbaker/simple-microservice.git /go/src/go_docker/ \ &

我对多阶段构建有一个问题,即在第一阶段构建的二进制文件被正确复制到第二阶段,但是当您尝试运行它时,无法找到可执行文件

dockerfile是:

FROM golang as goimage
ENV SRC=/go/src/
RUN mkdir -p /go/src/
WORKDIR /go/src/go_docker
RUN git clone https://github.com/bryonbaker/simple-microservice.git /go/src/go_docker/ \
&& CGO_ENABLED=0 GOOS=linux GOARCH=amd64
RUN go get github.com/gorilla/mux
RUN go build -o bin/go_docker

FROM alpine:latest AS microservice
RUN apk --no-cache add bash
ENV WORK_DIR=/docker/bin
WORKDIR $WORK_DIR
COPY --from=goimage /go/src/go_docker/bin/ ./

# Put a container-image version identifier in the root directory.
ARG VERSION=1.0
RUN echo $VERSION > image_version

EXPOSE 10000
#CMD ["go_docker"]
结果是:

$docker run-ti-p 80:10000 go docker:最新版本
/码头工人/垃圾箱

go\u docker图像\u版本
/docker/bin#/go_docker/bin/sh: /码头工人:未找到
/码头工人/垃圾箱#

如果我从构建的中间goimage容器运行二进制文件,那么它运行良好。文件大小匹配

注意:在这个dockerfile中,我已经注释掉了CMD和am通过shell进行的测试。如果取消对CMD的注释,则会出现相同的问题:

docker运行go docker:最新docker:来自守护进程的错误响应:OCI 运行时创建失败:容器\u linux。转到:344:启动容器 进程导致“exec:\“go\u docker\”:在中找不到可执行文件 $PATH”:未知。 ERRO[0001]等待容器时出错:上下文已取消

如果您想查看,我已经公开了git repo中的测试代码


提前感谢

如果二进制文件的共享库不可用,那么在Linux上几乎普遍会出现此错误。(在调试shell中,尝试运行
ldd/docker/bin/go\u docker

您可能不希望看到动态链接的二进制文件,但是您得到了一个,因为shell和环境变量不会在
RUN
命令之间传递。如果在
运行
步骤结束时设置
CGO\u ENABLED=0
,则当实际的
go build
运行两个步骤后,该值将丢失

(我还要稍微清理一下Dockerfile:容器中的路径等不必是变量,使用系统路径也可以。)

这就给我们留下了:

来自golang作为goimage的

#使用标准$GOPATH布局?
#WORKDIR/go/src/github.com/byronbaker/simple-microservice
#复制。
#快跑,快跑。
#运行CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go安装。
# !!! 如果repo更改,Docker层缓存将不会重复此步骤
# !!! 您将无法生成未提交代码的测试副本
运行git克隆https://github.com/bryonbaker/simple-microservice.git /go/src/go_码头工人
运行go-get-github.com/gorilla/mux
#vvv将魔术环境变量放在这一行
运行CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go安装go_docker
# ^^^
#运行时映像
来自阿尔卑斯山:最新
复制--from=goimage/go/bin/go\u docker/bin/go\u docker
ARG版本=1.0
运行echo$VERSION>/image\u VERSION
曝光10000
CMD[“go_docker”]

介意包括您用来构建此图像的命令吗?我可以建议一个更具体的标题吗?e、 g.“多阶段dockerfile构建中缺少go程序”很好!我完全忘记了“安装”。你能解释一下为什么设置环境变量以后会丢失吗?我认为这个问题只发生在FROM之后。每个
RUN
命令都在新容器中的新shell中运行。您可以使用
运行导出…
之类的操作,并查看它是否没有效果
ENV
将跨层持久化,并显示在
RUN
commands'环境中(当您从
新图像启动
时会重置)。