Типичный образ Docker содержит минимальный набор библиотек и утилит для запуска одной конкретной программы. Кроме того, файловые системы контейнера Docker не являются долгоживущими: удаление и воссоздание контейнера является чрезвычайно обычной процедурой, например, для использования более новой версии базового образа.
Результатом этого является то, что вы никогда не хотите напрямую редактировать файлы в контейнере Docker, и большинство изображений не настроены с помощью "богатых" инструментов редактирования. ( BusyBox содержит минимальное значение vi
, поэтому большинство изображений на основе Alpine также будут.) Если вы внесете какое-либо изменение, оно будет потеряно, как только вы удалите контейнер. (Точно так же вы обычно можете установить vim
или emacs
или что-то еще, но это будет потеряно, как только контейнер будет удален: установка программного обеспечения в работающий контейнер обычно не является лучшей практикой. ) * +1010 *
Есть два хороших способа справиться с этим, в зависимости от того, что это за файл.
Если файл является частью приложения , подобно исходному файлу, отредактируйте, отладьте и протестируйте его вне пространства Docker. Как только вы убедитесь, что это правильно (запустив модульные тесты и запустив программу локально), docker build
создайте новый образ и docker run
новый контейнер с новым образом.
ed config.py
pytest
docker build -t imagename .
docker run -d -p ... --name containername imagename
...
ed config.py
pytest
docker build -t imagename .
docker stop containername
docker run -d -p ... --name containername imagename
Если файл конфигурации , который необходимо вставить при запуске приложения, опция docker run -v
- это хороший способ вставить его. Вы можете напрямую отредактировать файл конфигурации на своем хосте, но вам, вероятно, потребуется перезапустить (или удалить и заново создать) контейнер, чтобы он это заметил.
ed config.txt
docker run \
-v $PWD/config.txt:/etc/whatever/config.txt \
--name containername -p ... \
imagename
...
ed config.txt
docker stop containername
docker rm containername
docker run ... imagename