gpt4 book ai didi

docker - Docker多阶段构建的问题

转载 作者:行者123 更新时间:2023-12-02 19:04:02 27 4
gpt4 key购买 nike

我在多阶段构建中遇到问题,其中在第一阶段构建的二进制文件已正确复制到第二阶段,但是当您尝试运行它时,找不到可执行文件。

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:latest
/docker/bin # ls

go_docker image_version
/docker/bin # ./go_docker /bin/sh: ./go_docker: not found
/docker/bin #



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

注意:在此dockerfile中,我已注释掉CMD并通过 shell 进行测试。如果取消注释CMD,则会遇到相同的问题:

docker run go-docker:latest docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"go_docker\": executable file not found in $PATH": unknown. ERRO[0001] error waiting for container: context canceled



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

提前致谢

最佳答案

如果二进制文件的共享库不可用,您将在Linux上普遍收到此错误。 (在调试 shell 程序中,尝试运行ldd /docker/bin/go_docker。)

您可能不希望使用动态链接的二进制文件,但是却得到了一个二进制文件,因为shell和环境变量不会在RUN命令之间传递。在CGO_ENABLED=0步骤的末尾设置RUN的位置,当实际的go build在两个步骤之后运行时,该值将丢失。

(我还要稍微清理一下Dockerfile:容器内的路径之类的东西不必是变量,使用系统路径做事完全可以。)

这给我们留下了:

FROM golang as goimage

# Use standard $GOPATH layout?
# WORKDIR /go/src/github.com/byronbaker/simple-microservice
# COPY . .
# RUN go get .
# RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install .

# !!! Docker layer caching will not repeat this step if the repo changes
# !!! You won't be able to build a test copy of your uncommitted code
RUN git clone https://github.com/bryonbaker/simple-microservice.git /go/src/go_docker
RUN go get github.com/gorilla/mux

# vvv Put magic environment variables in this line
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install go_docker
# ^^^

# Runtime image
FROM alpine:latest
COPY --from=goimage /go/bin/go_docker /bin/go_docker
ARG VERSION=1.0
RUN echo $VERSION > /image_version
EXPOSE 10000
CMD ["go_docker"]

关于docker - Docker多阶段构建的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56057688/

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