Образы Docker неизменяемы, то есть их структура и содержимое не могут быть изменены после завершения процесса сборки, однако есть следующие способы для изменения докер образа.
Создание нового Docker image на основе существующего
Изменить Docker image можно путем создания нового образа Docker на основе существующего, например, в случае если в образ докер необходимо добавить новый файл, мы создадим новый слой с данным файлом. И так перейдем непосредственно к делу.
Создайте новый dockerfile и используйте существующий образ докер в качестве базового.
1 2 |
FROM myName/myImage:latest ADD myFile.py bin/myFile.py |
Затем создайте контейнер:
1 |
docker build . |
Изменить первоначальный Dockerfile
Наиболее часто используемым методом изменения docker образа, является редактирование Dockerfile, который используется для создания изображения Docker. Это удобный и надежный метод редактирования изображения docker.
Пример файла Dockerfile для контейнера мониторинга Zabbix будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 |
zabbix-agent: container_name: zabbix-agent image: zabbix/zabbix-agent:latest net: "host" privileged: true restart: always environment: ZBX_SERVER_HOST: zabbix.mysite.com |
Чтобы изменить образ, используемый существующим контейнером, мы удаляем этот контейнер, редактируем Dockerfile с необходимыми изменениями и воссоздаем контейнер с новым файлом.
В этом примере файла Dockerfile образ, используемый для создания контейнера, называется ‘zabbix / zabbix-agent: последняя версия». Этот образ можно изменить на другой или версию, отредактировав этот файл.
Инструмент ‘docker compose’ помогает легко управлять несколькими контейнерами Docker с помощью одного YAML-файла Docker. В случаях, когда изменения необходимо внести только для одного контейнера, его можно отредактировать в файле.
После внесения изменений в изображение необходимо воссоздать только соответствующие контейнеры, а остальные можно оставить нетронутыми. Для этого используется опция “–no-recreate”.
1 |
docker-compose -f dockerfile.yml up -d --no-recreate |
Поскольку контейнеры Docker предназначены для перезапуска и создания заново, их нельзя использовать для хранения постоянных данных. Данные в инфраструктуре Docker обычно хранятся в томах Docker.
Хранение данных в томах вне контейнеров гарантирует, что даже при повторном создании контейнеров связанные с ними данные не будут затронуты.
Это позволяет нам легко редактировать изображение docker без потери базовых данных. Изменение Dockerfiles также помогает отслеживать изменения, внесенные в изображения.
При изменении файла Dockerfile необходимо соблюдать максимальную осторожность, особенно в производственной среде, поскольку одна ошибка может привести к нарушению нормального функционирования контейнера.
Фиксация изменений в Docker контейнере
Еще один способ изменить докер образ, использовать docker commit. docker commit позволяет пользователям использовать работающий контейнер и сохранять его текущее состояние в виде изображения, значит создавать новый образ Docker на основе содержимого контейнера. Новый образ включает базовое изображение и слой, содержащий изменения, сделанные внутри контейнера.
Команда docker commit
использует следующий синтаксис:
1 |
docker commit [options] [container-id-or-name] [image-name]:[tag] |
Общий рабочий процесс выглядит следующим образом:
Запустите контейнер из образа для редактирования:
1 |
docker run -it --name editcontainer ubuntu |
Получите доступ к оболочке внутри контейнера и измените содержимое по мере необходимости:
1 2 3 4 |
apt-get update apt install vim mkdir /myconfigs # etc |
Перенесите изменения в новый образ:
1 |
docker commit editcontainer myeditedimage |
Давайте рассмотрим реальный пример редактирования содержимого изображения вручную:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Run container docker run -it --name editubuntu ubuntu:latest # Install updates apt-get update apt-get install python3 # Add new file echo "hello" > /myfile.txt # Commit changes to new image docker commit editubuntu mycustomubuntu |
Теперь mycustomubuntu
содержит Python и новый файл, которого изначально не было в ubuntu:latest
образе.