Как редактировать файлы контейнера Docker с хоста?
Теперь, когда я нашел способ выставить файлы хоста в контейнер (опция -v), я хотел бы сделать что-то противоположное:
Как я могу редактировать файлы из работающего контейнера с помощью редактора узла?
sshfs, возможно, выполнит задание, но поскольку запущенный контейнер уже является своего рода хост-каталогом, я задаюсь вопросом, есть ли способ для переноса (между aufs, btrfs и device mapper)?
Ответы
Ответ 1
В то время как это возможно, и другие ответы объясняют, как это сделать, вы должны избегать редактирования файлов в файловой системе Союза, если сможете.
Ваше определение томов не совсем правильно - это больше об обходе файловой системы Союза, чем об экспорте файлов на хост. Например, если я:
$ docker run --name="test" -v /volume-test debian echo "test"
Каталог /volume-test
внутри контейнера не будет частью файловой системы Союза и вместо этого будет существовать где-то на хосте. Я не указал, где на хосте, так как мне может быть все равно - я не просматриваю файлы хоста, просто создавая каталог, который можно использовать между контейнерами и хостом. Вы можете узнать, где именно находится на хосте:
$ docker inspect -f "{{.Volumes}}" test
map[/volume_test:/var/lib/docker/vfs/dir/b7fff1922e25f0df949e650dfa885dbc304d9d213f703250cf5857446d104895]
Если вам действительно нужно просто быстро отредактировать файл для проверки чего-либо, либо используйте docker exec
, чтобы получить оболочку в контейнере и отредактировать напрямую, либо используйте docker cp
, чтобы скопировать файл, отредактировать на хост и копировать обратно.
Ответ 2
Лучший способ:
$ docker cp CONTAINER:FILEPATH LOCALFILEPATH
$ vi LOCALFILEPATH
$ docker cp LOCALFILEPATH CONTAINER:FILEPATH
Ограничения с помощью $docker exec: он может прикрепляться только к запущенному контейнеру.
Ограничения с запуском $docker: он создаст новый контейнер.
Ответ 3
Я использую плагин sftp из своей IDE.
- Установите ssh-сервер для вашего контейнера и разрешите root-доступ.
- Запустите контейнер докеров с -p localport: 22
- Установить из вашей IDE плагин sftp
Пример использования возвышенного плагина sftp:
https://www.youtube.com/watch?v=HMfjt_YMru0
Ответ 4
Мы можем использовать другой способ редактирования файлов внутри рабочих контейнеров (это не будет работать, если контейнер остановлен).
Логика предназначена для:
-) копировать файл из контейнера в узел
-) редактировать файл на хосте с помощью его главного редактора
-) скопировать файл обратно в контейнер
Мы можем выполнить все эти шаги вручную, но я написал простой bash script, чтобы сделать это легко одним вызовом.
/bin/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/путь/в/файл/в/контейнер
script очень прост, но он отлично работает для меня.
Любые предложения приветствуются.
Ответ 5
Здесь script я использую:
#!/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
Ответ 6
Если вы думаете, что ваш том - "сетевой диск", это будет проще. Чтобы отредактировать файл, расположенный на этом диске, вам просто нужно включить другой компьютер и подключиться к этому сетевому диску, а затем отредактировать файл как обычно.
Как это сделать чисто с помощью докера (без FTP/SSH...)?
- Запустите контейнер с редактором (VI, Emacs). Поиск Docker для "Alpine Vim"
Пример:
docker run -d --name shared_vim_editor \
-v <your_volume>:/home/developer/workspace \
jare/vim-bundle:latest
- Запустите интерактивную команду:
docker exec -it -u root shared_vim_editor/bin/bash
Надеюсь это поможет.
Ответ 7
Я использую Emacs с установленным пакетом docker
. Я бы порекомендовал Spacemacs версию Emacs. Я хотел бы выполнить следующие шаги:
1) Установите Emacs (Инструкция) и установите Spacemacs (Инструкция)
2) Добавьте docker
в ваш файл .spacemacs
3) Запустите Emacs
4) Найдите файл (SPC+f+f
) и введите /docker:<container-id>:/<path of dir/file in the container>
5) Теперь ваш emacs будет использовать контейнерную среду для редактирования файлов
Ответ 8
docker run -it -name YOUR_NAME IMAGE_ID /bin/bash
$>vi path_to_file
Ответ 9
Следующие работали для меня
docker run -it IMAGE_NAME /bin/bash
например. мое изображение было названо ipython/notebook
docker run -it ipython/notebook /bin/bash