Назад к вопросам
Senior
3
В чём основная проблема данного примера Dockerfile FROM golang:1.16 WORKDIR /app COPY go.mod . COPY go.sum . RUN go mod download COPY . . RUN go build -o crashAnalysis . CMD ["./crashAnalysis"] EXPOSE 9090 - Отсутствует ENV для конфигурации - Отсутствие многоступенчатых билдов - Никогда не удаляются временные файлы - Неоптимальное использование RUN - Порт 8081 не указан в инструкции EXPOSE
Компании, где спрашивали
СБК ПАРУС
Ответ от нейросети
sobes.tech AI
Основная проблема данного Dockerfile — отсутствие многоступенчатой сборки (multi-stage build), что приводит к большому размеру итогового образа и включению в него ненужных файлов и инструментов для сборки.
Подробности:
- Используется базовый образ
golang:1.16, который содержит весь инструментарий для разработки и сборки, но он тяжелый. - После сборки бинарника в образе остаются все исходники, кеши и инструменты, что увеличивает размер.
- Отсутствие многоступенчатой сборки не позволяет отделить этап сборки от этапа запуска.
Рекомендуется использовать многоступенчатую сборку, где в первом этапе происходит сборка приложения, а во втором — создаётся минимальный образ с только бинарником и необходимыми зависимостями.
Пример улучшенного Dockerfile:
FROM golang:1.16 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o crashAnalysis .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/crashAnalysis .
EXPOSE 9090
CMD ["./crashAnalysis"]
Дополнительно:
- Можно добавить
ENVдля конфигурации, если нужно. - Оптимизировать слои, объединяя команды
RUN. - Убедиться, что указанный порт в
EXPOSEсоответствует используемому приложением (в вопросе упоминается порт 8081, но в Dockerfile указан 9090).