Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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...)?

  1. Запустите контейнер с редактором (VI, Emacs). Поиск Docker для "Alpine Vim"

Пример:

docker run -d --name shared_vim_editor \
 -v <your_volume>:/home/developer/workspace \
jare/vim-bundle:latest
  1. Запустите интерактивную команду:

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