Оптимизация Docker-образов: multi-stage и ARG для секретов

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

dockermulti-stagearg

👁 Существует возможность не только строить образы с помощью multi-stage builds, но и эффективно управлять секретами, такими как API-ключи или пароли, прямо в процессе сборки. Использование аргументов ARG в сочетании с переменными окружения позволяет делать процесс сборки более гибким и безопасным.

📝 Использование Multi-Stage Builds для уменьшения размера образа

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

# Этап 1: Сборка
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Этап 2: Финальный образ
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

📝Передача секретов с помощью ARG и ENV

Для безопасной передачи секретов во время сборки образа вы можете использовать переменные окружения, которые можно передавать через флаг --build-arg и затем использовать их для настройки. Пример с использованием ARG для API-ключа:

FROM node:14 AS builder
ARG API_KEY
RUN curl -H "Authorization: Bearer $API_KEY" https://example.com

Для сборки используем:
docker build --build-arg API_KEY=my-secret-api-key -t myapp .

📝 Секреты в Docker Compose

При использовании Docker Compose можно передавать переменные окружения в docker-compose.yml, не оставляя их в Dockerfile, что увеличивает безопасность:

version: '3.7'
services:
  app:
    build:
      context: .
      args:
        API_KEY: ${API_KEY}
    environment:
      - API_KEY=${API_KEY}

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

tags: #docker #разработка

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот кода: Dockerfile с примерами multi-stage build и передачей ARG для API-ключа, отображён на тёмном брендированном фоне с логотипом RECURA
Фрагмент Dockerfile с многоступенчатой сборкой и примером передачи ARG для API-ключа.

Читайте так же