【问题标题】:Using variables across multi-stage docker build在多阶段 docker build 中使用变量
【发布时间】:2019-07-13 23:24:38
【问题描述】:

我想在多阶段 docker 构建中使用变量。类似于This 问题(在撰写本文时尚未回答。)

我的具体用例是在 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"]

【问题讨论】:

    标签: dockerfile docker-build docker-multi-stage-build


    【解决方案1】:

    要发送变量,我们可以使用“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"]
    

    【讨论】:

    • 我知道我可以做到这一点,这就是我目前所做的。问题是我想为此目的使用变量。 (重点是以某种方式使用变量。)
    • 我实际上回答了你说没有回答的问题stackoverflow.com/questions/52904847/…
    • 您在那边的回答似乎可行/合法:) 我会在周日尝试。谢谢。
    • 我也会在此处更新此答案以将其标记为正确答案
    猜你喜欢
    • 2023-02-11
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2019-03-25
    • 2019-10-10
    • 2020-12-05
    相关资源
    最近更新 更多