Intereting Posts
Соединение отклонено с kubectl на экземпляре EC2 ubuntu? Невозможно запустить регистратор, используя docker-compose. Ошибка соединения с соединением Сохранять пользователей в контейнерах Лучший способ получить последний git-код с перезагрузкой Docker? Почему Docker Hub не кэширует автоматические сборки репозиториев по мере создания изображений? Применить изменения к контейнеру докера после «exec» в него TravisCI – Docker – Ошибка Exec Создание заданий cron через Dockerfile Несколько приложений, работающих одновременно на одном изображении Docker Как решить «invoke-rc.d: policy-rc.d отказано в выполнении запуска» при создании контейнера Ubuntu 14.04 и установке apache2? docker-node: работает как пользователь без полномочий root, права доступа к файлам Msgstr "Имя каталога / app / Views / недействительно" в развертывании ядра ASP.NET с использованием докеры ошибка разрешения при выполнении запуска докеров Как добавить изображение в организацию в Docker Hub? Поместите python-pip на изображение докеры CentOS?

Как редактировать файлы контейнера Docker с хоста?

Теперь, когда я нашел способ выставить файлы хоста в контейнер (опция -v), я хотел бы сделать нечто противоположное:

Как я могу редактировать файлы из работающего контейнера с помощью редактора узлов?

sshfs, вероятно, мог бы выполнить эту работу, но поскольку запущенный контейнер уже является своего рода хост-каталогом, я задаюсь вопросом, есть ли способ для переноса (между aufs, btrfs и device mapper)?

Хотя это возможно, и другие ответы объясняют, как это сделать, вы должны избегать редактирования файлов в файловой системе Союза, если сможете.

Ваше определение томов не совсем правильно – это больше об обходе файловой системы Союза, чем об экспорте файлов на хост. Например, если я это сделаю:

$ docker run --name="test" -v /volume-test debian echo "test" 

/volume-test каталога /volume-test внутри контейнера не будет частью файловой системы Союза и будет существовать где-то на хосте. Я не указал, где на хосте, так как мне может быть все равно – я не просматриваю файлы хоста, просто создавая каталог, который можно использовать между контейнерами и хостом. Вы можете узнать, где именно находится на хосте:

 $ docker inspect -f "{{.Volumes}}" test map[/volume_test:/var/lib/docker/vfs/dir/b7fff1922e25f0df949e650dfa885dbc304d9d213f703250cf5857446d104895] 

Если вам действительно нужно просто сделать быстрое редактирование файла для проверки чего-либо, либо используйте docker exec чтобы получить оболочку в контейнере и отредактировать напрямую, либо использовать docker cp чтобы скопировать файл, отредактировать на хосте и скопировать его обратно ,

Лучший способ:

  $ docker cp CONTAINER:FILEPATH LOCALFILEPATH $ vi LOCALFILEPATH $ docker cp LOCALFILEPATH CONTAINER:FILEPATH 

Ограничения с помощью $ docker exec: он может прикрепляться только к запущенному контейнеру.

Ограничения с запуском $ docker: он создаст новый контейнер.

Я использую плагин sftp из своей IDE.

  1. Установите ssh-сервер для своего контейнера и разрешите root-доступ.
  2. Запустите контейнер докеров с -p localport: 22
  3. Установите из своей среды IDE плагин sftp

Пример использования sublime sftp plugin: https://www.youtube.com/watch?v=HMfjt_YMru0

Вот сценарий, который я использую:

 #!/bin/bash IFS=$'\n\t' set -euox pipefail CNAME="$1" FILE_PATH="$2" TMPFILE="$(mktemp)" docker exec "$CNAME" cat "$FILE_PATH" > "$TMPFILE" $EDITOR "$TMPFILE" cat "$TMPFILE" | docker exec -i "$CNAME" sh -c 'cat > '"$FILE_PATH" rm "$TMPFILE" 

и суть, когда я исправлю это, но забудьте обновить этот ответ: https://gist.github.com/dmohs/b50ea4302b62ebfc4f308a20d3de4213

Мы можем использовать другой способ редактирования файлов внутри рабочих контейнеров (это не будет работать, если контейнер остановлен).

Логика:
-) копировать файл из контейнера в хост
-) редактировать файл на хосте, используя его главный редактор
-) копировать файл обратно в контейнер

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

/ бен / dmcedit:

 #!/bin/sh set -e CONTAINER=$1 FILEPATH=$2 BASE=$(basename $FILEPATH) DIR=$(dirname $FILEPATH) TMPDIR=/tmp/m_docker_$(date +%s)/ mkdir $TMPDIR cd $TMPDIR docker cp $CONTAINER:$FILEPATH ./$DIR mcedit ./$FILEPATH docker cp ./$FILEPATH $CONTAINER:$FILEPATH rm -rf $TMPDIR echo 'END' exit 1; 

Пример использования:

dmcedit CONTAINERNAME / путь / в / файл / в / контейнер

Сценарий очень прост, но он отлично работает для меня.

Любые предложения приветствуются.

 docker run -it -name YOUR_NAME IMAGE_ID /bin/bash $>vi path_to_file 

Следующие работали для меня

docker run -it IMAGE_NAME /bin/bash

например. мое изображение было названо ipython / notebook

docker run -it ipython/notebook /bin/bash