Je commence à travailler avec Docker. J'utilise l'image de base de WordPress et docker-compose.
J'essaie de me connecter à l'un des conteneurs pour inspecter les fichiers/répertoires qui ont été créés lors de la construction initiale. J'ai essayé d'exécuter docker-compose run containername ls -la
, mais cela n'a rien donné. Même si c'était le cas, je préférerais avoir une console où je peux parcourir la structure des répertoires, plutôt que d'exécuter une seule commande. Quelle est la bonne façon de procéder avec Docker ?
docker attach
vous permettra de vous connecter à votre conteneur Docker, mais ce n'est pas vraiment la même chose que ssh
. Si votre conteneur fait tourner un serveur web, par exemple, docker attach
vous connectera probablement au stdout du processus du serveur web. Il ne vous donnera pas nécessairement un shell.
La commande docker exec
est probablement ce que vous recherchez ; elle vous permettra d'exécuter des commandes arbitraires à l'intérieur d'un conteneur existant. Par exemple :
docker exec -it <mycontainer> bash
Bien sûr, la commande que vous exécutez doit exister dans le système de fichiers du conteneur.
Dans la commande ci-dessus, <mycontainer>
est le nom ou l'ID du conteneur cible. Peu importe que vous utilisiez ou non docker compose
; exécutez simplement docker ps
et utilisez soit l'ID (une chaîne hexadécimale affichée dans la première colonne) ou le nom (affiché dans la dernière colonne). Par exemple, donné :
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
je peux l'exécuter :
$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
Je pourrais accomplir la même chose en exécutant :
$ docker exec -it d2d4a89aaee9 ip addr
De même, je pourrais lancer un shell dans le conteneur ;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
docker exec
sera certainement une solution. Une façon simple de travailler avec la question que vous avez posée est de monter le répertoire dans Docker sur le répertoire du système local.
Ainsi, vous pouvez voir les changements dans le chemin local instantanément.
docker run -v /Users/<path>:/<container path>
Une autre option consiste à utiliser nsenter.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid