web-dev-qa-db-fra.com

Le port Docker peut-il être transféré vers un socket de fichier Unix sur le conteneur Host?

L'exécution de la commande suivante échoue:

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

Quelque chose ne va pas avec ma syntaxe de redirection de port ou une configuration comme celle-ci n'est-elle pas possible?

22
Ed Sullivan

Docker -p la syntaxe ne prendra pas de socket Unix:

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

Une solution serait de:

  • Exécutez votre conteneur sans -p spécification, nous l'appellerons "cont1" (--name cont1)
  • Exécutez un deuxième conteneur qui:
    • Bind monte le socket unix (-v /tmp/file.sock:/tmp/file.sock) pour l'avoir accessible depuis l'intérieur du conteneur
    • Liens vers le premier conteneur (--link cont1:cont1) pour pouvoir s'y connecter
    • Exécute un outil tel que socat pour acheminer le trafic de la socket unix vers le "cont1:4444" point de terminaison

Je ne suis pas un expert en socat, mais la spécification d'adresse dont vous aurez besoin devrait ressembler à ceci: UNIX-LISTEN:/tmp/file.sock,fork,reuseaddr TCP4:cont1:4444

27
icecrime

La réponse acceptée est cependant partiellement correcte car vous ne pouvez lier que des répertoires, ce qui signifie que vous devez lier le répertoire du socket au lieu du socket lui-même.

Ce qui suit l'a fait pour moi quand je voulais connecter une prise postgres.

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

Cela permet de lier le fichier socket postgres à votre système hôte.

6
Vasspilka