Как использовать один и тот же dockerfile для dev и prod - PullRequest
1 голос
/ 13 мая 2019

У меня есть 2 Dockerfile, 1 для разработчика и 1 для продукта:

PROD:

FROM golang AS builder
WORKDIR /go/src/gitlab.com/company/project
COPY . .
RUN go build -o ./release/api .

FROM scratch
EXPOSE 9999
COPY --from=builder /go/src/gitlab.com/company/project/release/api .
CMD ["./api"]

и DEV:

FROM golang
WORKDIR /go/src/gitlab.com/company/PROJECT
COPY . .
RUN go build -o ./release/api .
CMD ["./release/api"]

Я хотел бы объединить эти два в один, так как поддержание 2 Dockerfile - это плохая практика

Основное отличие состоит в том, что в dev я работаю с golang image, что практично, а в prod я работаю с scratch image, что значительно уменьшает размер моего двоичного файла.

Кажется, что я могу использовать несколько этапов в Dockerfile и указывать имя этапа во время сборки:

docker build . --target=builder

Но если я сделаю это, я не знаю, как условно запустить мое приложение на первом этапе = [Если я в dev, запустите приложение на первом этапе, в противном случае запустите приложение на втором этапе]

Как мне это сделать?

1 Ответ

3 голосов
/ 13 мая 2019

Как насчет этого?Я не проверял его и не продумывал ваш пример глубоко, но, может быть, он где-то близок к тому, что вам нужно / помогает вам найти окончательное решение?

FROM golang:alpine AS base
WORKDIR /go/src/gitlab.com/company/project
COPY . .
RUN go build -o ./release/api .

FROM base AS dev
CMD ["./release/api"]

FROM scratch AS prod
EXPOSE 9999
COPY --from=base /go/src/gitlab.com/company/project/release/api .
CMD ["./api"]

В зависимости от значения, указанного в targetdocker build --target=prod или docker build --target=dev, будет создано другое изображение.

...