/var/run/docker.sock
в контейнере - это сокет Docker хоста, и ничего больше. Это связано с тем, что:
- Контейнер Docker не запускает никаких программ, кроме тех, которые явно запущены в его точке входа и / или команде, и это почти всегда просто одна прикладная программа.
- Предположительно, вы не пытаетесь запустить демон Docker, поэтому он установлен, но не работает.
- Файлы сокетов Unix не будут созданы, пока демон не запустится и bind (2) сокет для конкретного файла.
- Опция
docker run -v
всегда будет «проталкивать» содержимое хоста в контейнер, и это происходит до запуска любого из процессов контейнера.
Таким образом, в описываемом вами сценарии это не может быть ничем иным, кроме сокета Docker хоста, потому что нет второго демона Docker.
Скажем, дляради аргумента, что вы действительно запускаете второго демона таким образом.
Порядок операций здесь: (1) Docker устанавливает файловую систему контейнера, (2) Docker запускает команду entrypoint, (3) точка входа запускает демон, (4) демон пытается создать файл сокета. В момент запуска демона его файл сокета уже будет существовать. Я полагаю, что это вызовет сбой вызова bind (2) с EADDRINUSE
, и демон не запустится. Надеемся, что это приведет к сбою запуска вашего контейнера.
Вы могли бы по праву захотеть запустить демон в контейнере, который публикует сокет Unix, к которому вы хотите получить доступ с хоста. Для этого вам нужно смонтировать каталог в контейнер и навести на него демон. Вероятно, это не может быть /var/run
с обеих сторон (на хосте /var/run
есть много вещей; при монтировании каталога скрывается существующее содержимое в контейнере, и вы также можете захотеть /var/run
контейнера). Это должен быть каталог, а не имя файла сокета, так как Docker создаст пустой каталог, если он не существует; что-то будет существовать в контейнере по этому пути, и привязка завершится неудачей.
Поэтому, если вы хотите запустить гипотетический демон foo внутри контейнера, он будет выглядеть примерно как
docker run \
--name foo \ # container name
-v $PWD/socket:/socket \ # bind mount a directory
foo \ # image name
food \ # command to run in the container
--foreground \ # don't daemonize; keep the container alive
--bind fd://socket/foo.sock # put the socket in the shared directory
На хосте вам нужно установить FOO_SOCKET_PATH=$PWD/socket/foo.sock
или иным образом указать на этот конкретный файл.