Скопируйте файлы из контейнера fs в одноуровневый контейнер - PullRequest
3 голосов
/ 11 мая 2019

Скажем, я работаю в контейнере, который был запущен с:

docker run -v /var/run/docker.sock:/var/run/docker.sock foo

, затем я запускаю другой контейнер из вышеупомянутого:

docker run -v /var/run/docker.sock:/var/run/docker.sock bar

мой вопрос - это/var/run/docker.sock из второй команды, указывающей на тот же /var/run/docker.sock, что и первая команда?

Контейнеры должны быть братьями и сестрами , поэтому мой второйвопрос - как я могу получить файлы из «внешнего» контейнера во «внутренний» контейнер с помощью опции -v?Я хочу сделать:

docker run -v "/foo:/bar" -v /var/run/docker.sock:/var/run/docker.sock bar

1 Ответ

0 голосов
/ 11 мая 2019

Когда вы монтируете докер-сокет в контейнер, он / она дает контейнеру контроль над экземпляром докера, выполняющего на хосте .

Вы можете думать об этом как о предоставлении нескольким контейнерам URL-адреса веб-сайта. Что бы ни делали аналогичные контейнеры, влияет на аналогичный веб-сайт, и эти изменения будут видны всем.

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

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

Чтобы ответить на ваш второй вопрос, копирование файлов между контейнерами включает запуск команды, которая выдает содержимое файла в исходный контейнер, и передачу его в команду, которая записывает файл назначения в контейнер назначения. Например:

docker exec container1 cat /source/file | docker exec -i container2 bash -c "cat > /dest/file"

Копирование нескольких файлов может включать создание архива в источнике и расширение его в другом:

docker exec container1 tar -C /source -c dir| docker exec -i container2 tar -C /dest -x

Для удобства и для ситуаций, когда оболочка или tar недоступны в контейнере, docker cp можно использовать для копирования файлов из контейнера на хост. Скопировав файл из исходного контейнера на хост, а затем в целевой контейнер, вы можете прийти к тому же решению, потратив немного временного хранилища. Например:

docker cp container1:/source/file file
docker cp file container2:/dest/file

Вы были на что-то, хотя. Альтернативой может быть монтирование каталога с хоста в оба контейнера и связь через этот каталог. Например:

mkdir shared
docker run -d --name=container1 -v $PWD/shared:/mnt/share image command
docker run -d --name=container2 -v $PWD/shared:/mnt/share image command

Несмотря на опечатки, приведенный выше пример приведет к тому, что станут доступны два контейнера. Процессы в этих двух контейнерах могут обмениваться файлами через /mnt/share с поддержкой каталога shared/ на хосте.

...