我有一个多阶段构建的问题,其中在第一阶段构建的二进制文件被正确复制到阶段 2,但是当您尝试运行它时,找不到可执行文件。
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 # lsgo_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: 来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:344:启动容器进程导致“exec:\”go_docker\”:在 $PATH 中找不到可执行文件”:未知。ERRO[0001] 错误等待容器:上下文取消
如果你想看的话,我已经把 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"]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句