在多阶段 docker 构建中使用变量
Using variables across multi-stage docker build
我想在多阶段 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"]
要发送变量,我们可以使用 "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"]
我想在多阶段 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"]
要发送变量,我们可以使用 "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"]