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

Как сопоставить пути объема с помощью Docker --volumes-from?

Я новичок в Docker и очень рад использованию функции --volumes-from, но там что-то я не понимаю.

Если я хочу использовать --volumes-from с двумя контейнерами только для данных, каждый из которых экспортирует тома с именем /srv, как я могу препятствовать конфликтам томов? Я могу сопоставить имена томов при создании привязки с помощью [host-dir]:[container-dir]; как это сделать с помощью --volumes-from?

Итак, я хочу выглядеть примерно так:

docker run --name=DATA1 --volume=/srv busybox true
docker run --name=DATA2 --volume=/srv busybox true
docker run -t -i -rm --volumes-from DATA1:/srv1 --volumes-from DATA2:/srv2 ubuntu bash
4b9b3361

Ответ 1

Это можно сделать, но в данный момент он не поддерживается в интерфейсе командной строки docker.

Как к

Найти каталоги томов:

docker inspect DATA1 | grep "vfs/dir"
# output something like:
# "/srv": "/var/lib/docker/vfs/dir/<long vol id>"

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

# load directories in variables:
SRV1=$(docker inspect DATA1 | grep "vfs/dir" | awk '/"(.*)"/ { gsub(/"/,"",$2); print $2 }')
SRV2=$(docker inspect DATA2 | grep "vfs/dir" | awk '/"(.*)"/ { gsub(/"/,"",$2); print $2 }')

теперь, смонтируйте эти тома реальными каталогами вместо -volumes-from:

docker run -t -i -v $SRV1:/srv1 -v $SRV2:/srv2 ubuntu bash

IMO, функциональность идентична, потому что это то же самое, что и при использовании --volumes-from.

Ответ 2

Для полноты...

#create data containers
docker run --name=d1 -v /svr1 busybox sh -c 'touch /svr1/some_data'
docker run --name=d2 -v /svr2 busybox sh -c 'touch /svr2/some_data'

# all together...
docker run --rm --volumes-from=d1 --volumes-from=d2 busybox sh -c 'find -name some_data'
# prints:
#  ./svr2/some_data
#  ./svr1/some_data

# cleanup...
docker rm -f d1 d2

"--volumes-from = container" просто сопоставляет файловую систему, например mount --bind

Если вы хотите изменить путь, ответ Jiri будет (в настоящее время) единственным способом. Но если вы находитесь в ограниченной среде, вы можете использовать докеры, встроенные в возможности проверки синтаксического анализа:

# create data containers
docker run --name=DATA1 --volume=/srv busybox sh -c 'touch /srv/some_data-1'
docker run --name=DATA2 --volume=/srv busybox sh -c 'touch /srv/some_data-2'

# run with volumes and show the data
docker run \
  -v $(docker inspect -f '{{ index .Volumes "/srv" }}' DATA1):/srv1 \
  -v $(docker inspect -f '{{ index .Volumes "/srv" }}' DATA2):/srv2 \
  --rm busybox sh -c 'find -name some_data-*'
# prints:
# ./srv2/some_data-2
# ./srv1/some_data-1

# ditch data containers...
docker rm -f DATA1 DATA2

возможно, это даже работает со старой версией bash, которая поставляется с boot2docker.