Может ли порт докеров перенаправляться в unix файл на контейнер-хост?

Выполняется следующая команда:

sudo docker run -p unix:///tmp/file.sock:44444 -d image_name

Что-то не так с моим синтаксисом переадресации порта или такая конфигурация невозможна?

Ответы

Ответ 1

Синтаксис Docker -p не будет принимать unix-сокет:

-p=[]      : Publish a container᾿s port to the host (format:
             ip:hostPort:containerPort | ip::containerPort |
             hostPort:containerPort)

Одно из решений:

  • Запустите свой контейнер без спецификации -p, мы назовем его "cont1" (--name cont1)
  • Запустите второй контейнер, который:
    • Связывает монтирует сокет unix (-v /tmp/file.sock:/tmp/file.sock), чтобы он был доступен из контейнера
    • Links в первый контейнер (--link cont1:cont1), чтобы иметь возможность подключиться к нему
    • Запускает такой инструмент, как socat для маршрутизации трафика из Unix-сокета в конечную точку "cont1:4444"

Я не эксперт по софту, но необходимая вам спецификация адреса должна выглядеть так: UNIX-LISTEN:/tmp/file.sock,fork,reuseaddr TCP4:cont1:4444

Ответ 2

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

Следующее сделало это для меня, когда я хотел подключить сокет postgres.

docker run -p 5432:5432 -v /run/postgresql:/run/postgresql -d --name postgres postgres

Что это значит, ссылка на файл сокета postgres на вашу хост-систему.