Использование переменных в многоступенчатой ​​сборке Docker - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу использовать переменные в многоступенчатых сборках докеров.Аналогично Этот вопрос (без ответа на момент написания.)

Мой конкретный пример использования - построить мой проект Go на этапе builder и сохранить каталог, в котором это делается вПеременная и используйте ту же переменную на следующем этапе (ах): Переменная 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 Ответ

0 голосов
/ 21 февраля 2019

Для отправки переменной мы можем использовать решение «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

Также вы можете сохранить хеш в файл на первом этапе, скопировать файл на втором этапе, а затем прочитать и использовать его.там.

Из того, что я понимаю, вы хотите скопировать собранную программу в новый докер для многоэтапной сборки, чтобы размер вывода был меньше.По сути, вам не нужно отправлять переменную, которую вы должны знать, если вы создали ее в первом изображении, и скопируйте ее оттуда

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