我想在多阶段docker构建中使用变量。与This问题类似(在撰写本文时尚未回答。)
我的特定用例是在builder
阶段构建Go项目,并将该目录保存在变量中,并在下一阶段使用相同的变量:{{1} }变量。
我的Dockerfile是(注释行中的示例不起作用。):
BUILD_DIR
答案 0 :(得分:0)
要发送变量,我们可以使用“ ARG”解决方案,“基本”解决方案和“文件”解决方案。
ARG version_default=v1
FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}
FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}
另一种方法是将基础容器用于多个阶段:
FROM alpine:latest as base
ARG version_default
ENV version=$version_default
FROM base
RUN echo ${version}
FROM base
RUN echo ${version}
您可以在此处找到更多详细信息:https://github.com/moby/moby/issues/37345
另外,您可以在第一阶段将哈希保存到文件中,然后在第二阶段复制该文件,然后在其中读取并使用它。
据我了解,您想将生成的程序复制到新的docker中,以进行多阶段生成,以减小输出大小。 基本上,您不需要发送要在第一个映像中构建它并从那里复制它的变量就知道了
FROM golang:alpine as gobuilder
RUN apk update && apk add git
COPY sources/src/ $GOPATH/src/folder/
WORKDIR $GOPATH/src/folder/
#get dependencies
RUN go get -d -v
#build the binary
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-w -s" -o /go/bin/myGoProgram myGoSource.go
FROM alpine:latest
COPY --from=gobuilder /go/bin/myGoProgram /usr/local/bin/myGoProgram
ENTRYPOINT ["myGoProgram"] # or ENTRYPOINT ["/usr/local/bin/myGoProgram"]