Как внести изменения в запущенный Docker-контейнер?

«Как внести изменения в запущенный Docker-контейнер?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Прямое изменение файлов в запущенном контейнере — это антипаттерн для управления конфигурацией, так как изменения невоспроизводимы и теряются при пересоздании контейнера. Правильный подход — управление через образы и volumes.

Способы и когда их использовать:

1. Для отладки и экстренных исправлений (временное решение):

  • Вход в контейнер: docker exec -it <container_name> /bin/bash.
  • Копирование файлов: docker cp ./config.json <container_name>:/app/config.json.

    Важно: После таких правок нужно немедленно зафиксировать изменения в Dockerfile и пересобрать образ для будущих развертываний.

2. Правильный способ: Обновление образа и пересоздание контейнера Это основной workflow. Изменения вносятся в Dockerfile или файлы конфигурации, затем образ пересобирается и контейнер перезапускается.

   # Dockerfile
   FROM alpine:latest
   RUN apk add --no-cache nginx
   # Внесение изменения: копируем новый конфиг
   COPY nginx.conf /etc/nginx/nginx.conf
   CMD ["nginx", "-g", "daemon off;"]
   docker build -t my-app:latest .
   docker stop my-container && docker rm my-container
   docker run -d --name my-container my-app:latest

3. Для данных и конфигураций: Использование Volumes и ConfigMaps/Secrets (в Kubernetes)

  • Docker Volumes: Для постоянных данных (базы данных, загруженные файлы).
       docker run -d -v my_data_volume:/var/lib/mysql mysql:latest
  • Конфигурация через внешние файлы: Конфигурационные файлы, которые могут меняться, монтируются в контейнер из хостовой системы или специальных объектов (ConfigMap в k8s). Это позволяет менять конфигурацию без пересборки образа.
       docker run -d -v $(pwd)/config:/app/config my-app:latest

Вывод: Для воспроизводимости и соблюдения принципов Infrastructure as Code все изменения должны в конечном итоге приводить к обновлению Dockerfile или конфигурационных файлов, управляемых через систему контроля версий.