Πώς μπορώ να μπω στο κέλυφος ενός δοχείου Docker;

Αρχίζω να εργάζομαι με το 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  bash

Φυσικά, όποια εντολή και αν εκτελείτε πρέπει να υπάρχει στο σύστημα αρχείων του εμπορευματοκιβωτίου.

Στην παραπάνω εντολή `είναι το όνομα ή το 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:  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:  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
$
Σχόλια (8)

Το docker exec θα είναι σίγουρα μια λύση. Ένας εύκολος τρόπος για να δουλέψετε με την ερώτηση που θέσατε είναι να προσαρτήσετε τον κατάλογο μέσα στο Docker στον κατάλογο του τοπικού συστήματος.

Έτσι ώστε να μπορείτε να βλέπετε τις αλλαγές στην τοπική διαδρομή άμεσα.


docker run -v /Users/<path>:/
Σχόλια (2)

Μια άλλη επιλογή είναι η χρήση του nsenter.

PID=$(docker inspect --format {{.State.Pid}} )
nsenter --target $PID --mount --uts --ipc --net --pid
Σχόλια (4)