J'essaie de faire fonctionner une application sur Windows qui a été développée uniquement sur Unices. Tout est docké et utilise l'équilibreur de charge traefik. Les volumes du docker pour exécuter traefik ressemblent à ceci:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
Le premier volume fonctionne bien sur Mac ou Linux, mais fonctionne-t-il sur Windows? L'application échoue (l'équilibreur de charge donne un 404) et il peut être lié à ce volume. Lorsque je démarre l'image, la prise ressemble à une prise:
/ # ls -laF /var/run/docker.sock
srw-rw---- 1 root root 0 Sep 2 11:04 /var/run/docker.sock=
Est-ce que ça marche? Une façon de le tester? Quelle est la bonne façon de procéder?
En essayant de comprendre cela, j'ai essayé de le remplacer par ceci:
volumes:
- //./pipe/docker_engine:/var/run/docker.sock
basé sur divers articles et rapports de bogues que j'ai trouvés en ligne. L'image docker démarre mais elle échoue de la même manière et maintenant dans le conteneur docker elle ressemble à un répertoire:
/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x 2 root root 40 Sep 3 14:52 ./
drwxr-xr-x 1 root root 4096 Sep 3 14:57 ../
Suite aux réponses de Marc ABOUCHACRA, j'ai essayé:
volumes:
- type: npipe
source: ////./pipe/docker_engine
target: /var/run/docker.sock
consistency: delegated
mais cela ressemble aussi à un répertoire:
/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x 2 root root 40 Sep 3 14:52 ./
drwxr-xr-x 1 root root 4096 Sep 3 14:57 ../
J'ai également essayé ceci:
volumes:
- npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated
mais cela échoue avec cette erreur:
ERROR: Volume npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated has incorrect format, should be external:internal[:mode]
La totalité docker-compose.yml
la section ressemble à ceci:
lb:
image: load-balancer
build: ${WORKSPACE}/go-home/load_balancer
ports:
- 80:80
- 443:443
links:
- wifi-ui-dev
- wifi-ui-prod
- portal
- wifi-api
env_file:
- .env
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
Ma question concerne spécifiquement l'exécution de cette image Docker, qui est un Linux, sur un hôte Windows, exécutant Docker pour Windows. Je comprends que je peux l'exécuter sur un hôte Linux en installant Linux sur une autre machine ou un VM sur la machine Windows, c'est équivalent. Exécuter des invités Windows n'est pas ce que je recherche non plus au cas où il existe un moyen d'exposer les sockets de Windows à Windows uniquement.
L'utilisation d'une syntaxe courte avec le type de montage de liaison n'est pas possible: npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated
Vous devez utiliser la longue syntaxe dans votre fichier de composition:
volumes:
- type: npipe
source: ////./pipe/docker_engine
target: /var/run/docker.sock
consistency: delegated
Vous pouvez trouver de la documentation sur la longue syntaxe dans la documentation officielle . Cette syntaxe provient de v3.2
Gardez également à l'esprit ce que @ lucas-ramage a dit à propos de en utilisant le conteneur Windows uniquement lors de l'utilisation de npipe .
Par Docker pour Windows FAQ ,
Sur Docker Desktop pour Windows, les clients peuvent se connecter au Docker Engine via un canal nommé:
npipe:////./pipe/docker_engine
Voir aussi ceci problème sur GitHub ,
La version Windows de Docker n'utilise pas de socket Unix (
/var/run/docker.sock
) mais npipe (npipe:////./pipe/docker_engine
). Vous avez donc soit
- passer au conteneur linux qui exécute docker dans un linux virtualisé complet avec socket unix
- pour passer le npipe au lieu du socket unix au conteneur (conteneur windows uniquement)
- utiliser un socket réseau (devrait fonctionner avec linux et le conteneur windows)
Cependant, comme il s'agit d'un conteneur Linux, vos options sont soit A) Exécuter le docker dans une machine virtuelle (premier choix ci-dessus), soit B) Utilisez une prise réseau (le troisième choix).