Почему мой окончательный образ докера в этой многоэтапной сборке такой большой? - PullRequest
0 голосов
/ 07 июня 2018

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

# Configure environment and build settings.
FROM golang:alpine AS buildstage
ARG name=ddmnh
ENV GOPATH=/gopath

# Create the working directory.
WORKDIR ${GOPATH}

# Copy the repository into the image.
ADD . ${GOPATH}

# Move to GOPATH, install dependencies and build the binary.
RUN cd ${GOPATH} && go get ${name}
RUN CGO_ENABLED=0 GOOS=linux go build ${name}

# Multi-stage build, we just use plain alpine for the final image.
FROM alpine:latest

# Copy the binary from the first stage.
COPY --from=buildstage ${GOPATH}/${name} ./${name}
RUN chmod u+x ./${name}

# Expose Port 80.
EXPOSE 80

# Set the run command.
CMD ./ddmnh

Получившееся изображение, однако, похоже, не имеет уменьшенного размера.Я подозреваю, что изображение golang:alpine как-то включено.Ниже приведен скриншот результатов выполнения docker build . в Dockerfile выше.

docker images

Размер alpine:latest составляет всего 4,15 МБ.Добавляя размер скомпилированного двоичного файла (который относительно мал), я ожидал бы не более, скажем, возможно, 15 МБ для окончательного изображения.Но это 407 МБ.Я явно что-то не так делаю!

Как мне настроить Dockerfile для получения изображения меньшего размера?

1 Ответ

0 голосов
/ 07 июня 2018

Погрузившись глубоко в документацию Docker, я обнаружил, что мои ARG и ENV определения были очищены, когда я начал финальную FROM.Переопределение их решило вопрос:

# Configure environment and build settings.
FROM golang:alpine AS buildstage
ARG name=ddmnh
ENV GOPATH=/gopath

# Create the working directory.
WORKDIR ${GOPATH}

# Copy the repository into the image.
ADD . ${GOPATH}

# Move to GOPATH, install dependencies and build the binary.
RUN cd ${GOPATH} && go get ${name}
RUN CGO_ENABLED=0 GOOS=linux go build ${name}

# Multi-stage build, we just use plain alpine for the final image.
FROM alpine:latest
ARG name=ddmnh
ENV GOPATH=/gopath

# Copy the binary from the first stage.
COPY --from=buildstage ${GOPATH}/${name} ./${name}
RUN chmod u+x ./${name}

# Expose Port 80.
EXPOSE 80

# Set the run command.
CMD ./ddmnh
...