Αρχίζω να εργάζομαι με το Docker. Χρησιμοποιώ την εικόνα βάσης του WordPress και το docker-compose.
Προσπαθώ να μπω με ssh σε ένα από τα κοντέινερ για να επιθεωρήσω τα αρχεία/καταλόγους που δημιουργήθηκαν κατά την αρχική κατασκευή. Προσπάθησα να εκτελέσω το docker-compose run containername ls -la
, αλλά αυτό δεν έκανε τίποτα. Ακόμα και αν το έκανε, θα προτιμούσα να έχω μια κονσόλα όπου μπορώ να διασχίσω τη δομή των καταλόγων, παρά να τρέξω μια μόνο εντολή. Ποιος είναι ο σωστός τρόπος για να το κάνω αυτό με το Docker;
Το docker attach
θα σας επιτρέψει να συνδεθείτε στο δοχείο Docker σας, αλλά αυτό δεν είναι το ίδιο πράγμα με το ssh
. Αν το container σας τρέχει έναν webserver, για παράδειγμα, το docker attach
θα σας συνδέσει πιθανώς στο stdout της διεργασίας του web server. Δεν θα σας δώσει απαραίτητα ένα κέλυφος.
Η εντολή docker exec
είναι μάλλον αυτό που ψάχνετε- αυτή θα σας επιτρέψει να εκτελέσετε αυθαίρετες εντολές μέσα σε ένα υπάρχον container. Για παράδειγμα:
docker exec -it <mycontainer> bash
Φυσικά, όποια εντολή και αν εκτελείτε πρέπει να υπάρχει στο σύστημα αρχείων του εμπορευματοκιβωτίου.
Στην παραπάνω εντολή <mycontainer>
είναι το όνομα ή το ID του container-στόχου. Δεν έχει σημασία αν χρησιμοποιείτε ή όχι το docker compose
- απλά εκτελέστε το docker ps
και χρησιμοποιήστε είτε το ID (μια δεκαεξαδική συμβολοσειρά που εμφανίζεται στην πρώτη στήλη) είτε το όνομα (που εμφανίζεται στην τελευταία στήλη). Π.χ:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
Μπορώ να τρέξω:
$ 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
Θα μπορούσα να πετύχω το ίδιο πράγμα εκτελώντας:
$ docker exec -it d2d4a89aaee9 ip addr
Ομοίως, θα μπορούσα να ξεκινήσω ένα κέλυφος στο δοχείο,
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Το docker exec
θα είναι σίγουρα μια λύση. Ένας εύκολος τρόπος για να δουλέψετε με την ερώτηση που θέσατε είναι να προσαρτήσετε τον κατάλογο μέσα στο Docker στον κατάλογο του τοπικού συστήματος.
Έτσι ώστε να μπορείτε να βλέπετε τις αλλαγές στην τοπική διαδρομή άμεσα.
docker run -v /Users/<path>:/<container path>
Μια άλλη επιλογή είναι η χρήση του nsenter.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid