Ik'ben aan de slag gegaan met Docker. Ik'gebruik de WordPress base image en docker-compose.
Ik'probeer te ssh-en in een van de containers om de bestanden / mappen te inspecteren die zijn gemaakt tijdens de initiële build. Ik heb geprobeerd om docker-compose run containername ls -la
uit te voeren, maar dat deed't niets. Zelfs als het dat deed, zou ik'liever een console hebben waar ik de mappenstructuur kan doorlopen, in plaats van een enkel commando uit te voeren. Wat is de juiste manier om dit met Docker te doen?
docker attach
zal je laten verbinden met je Docker container, maar dit is'niet echt hetzelfde als ssh
. Als je container bijvoorbeeld een webserver draait, zal docker attach
je waarschijnlijk verbinden met de stdout van het webserver proces. Het zal je niet noodzakelijkerwijs een shell geven.
Het docker exec
commando is waarschijnlijk waar je naar op zoek bent; hiermee kun je willekeurige commando's uitvoeren binnen een bestaande container. Bijvoorbeeld:
docker exec -it <mycontainer> bash
Natuurlijk moet het commando dat je uitvoert wel bestaan in het bestandssysteem van de container.
In het bovenstaande commando <mycontainer>
is de naam of ID van de doelcontainer. Het maakt niet uit of je docker compose
gebruikt of niet; voer gewoon docker ps
uit en gebruik ofwel de ID (een hexadecimale string weergegeven in de eerste kolom) of de naam (weergegeven in de laatste kolom). Bijv. gegeven:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
kan ik uitvoeren:
$ 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
Ik zou hetzelfde kunnen bereiken door te draaien:
$ docker exec -it d2d4a89aaee9 ip addr
Op dezelfde manier zou ik een shell in de container kunnen starten;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
docker exec
zal zeker een oplossing zijn. Een gemakkelijke manier om te werken met de vraag die je stelde is door de directory binnen Docker te mounten naar de lokale systeem's directory.
Zodat je de veranderingen in het lokale pad direct kunt zien.
docker run -v /Users/<path>:/<container path>
Een andere optie is het gebruik van nsenter.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid