使用变量跨多阶段的Docker构建

7
我希望能够在多阶段Docker构建中使用变量。类似于这个问题(撰写时未得到答复)。
我的具体用例是在builder阶段中构建我的Go项目,并将其所在目录保存在一个变量中,在接下来的一个或多个阶段中使用相同的变量: BUILD_DIR 变量。
我的Dockerfile如下(注释行中的示例不起作用):
FROM golang:1.11.5 as builder

WORKDIR /project-name
# What I want to do:
#ENV BUILD_DIR /project-name
#WORKDIR ${BUILD_DIR}


# Vendored dependencies of my project:
COPY ./vendor ./vendor
COPY ./*.go ./
# Source code:
COPY ./go.* ./

RUN GOFLAGS=-mod=vendor GOOS=linux go build .

FROM something-else:some-version

WORKDIR some-folder

# Executable from previous stage:
COPY --from=builder /project-name/executable-name .
# Config files:
COPY ./conf ./conf

# What I want to do to copy the executable:
#COPY --from=builder /${BUILD_DIR}/executable-name .

ENTRYPOINT ["./executable-name"]
1个回答

11

我们可以使用“ARG”解决方案、"base"解决方案和"file"解决方案来发送变量。

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"]

我知道我可以做到那个,而且那就是我目前所做的。 问题在于我想要使用变量来实现这个目的。(关键是以某种方式使用变量。) - Amin Karbas
我实际上回答了你所说的未回答的问题,并给出了响应 https://dev59.com/U1QJ5IYBdhLWcg3w35-R - Jinxmcg
你在那边的回答看起来可行/合理 :) 我会在周日尝试一下。谢谢。 - Amin Karbas
我也会在这里更新答案,以标记它为正确答案。 - Jinxmcg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接