Теперь, когда я нашел способ выставить файлы хоста в контейнер (опция -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.
Пример использования 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