Docker Exec - Πώς να εκτελέσετε μια εντολή μέσα σε ένα Docker Image ή Container

Θα σας αφήσω εδώ ένα μυστικό DevOps εδώ: Το πράγμα που λατρεύουν όλοι οι DevOpsy είναι να δημιουργήσουν ένα σούπερ φανταχτερό και περίπλοκο σύστημα και, στη συνέχεια, να βρουν έναν τρόπο να το αντιμετωπίσουν σαν ένα κανονικό κέλυφος. Ή συνδεθείτε σε αυτό με SSH και στη συνέχεια μεταχειριστείτε το σαν ένα κανονικό κέλυφος.

Το Docker δεν είναι διαφορετικό! Εκτελείτε έναν υπολογιστή μέσα σε κάποιον άλλο υπολογιστή. Ίσως αυτός ο υπολογιστής είναι μια παρουσία EC2 ή ένας φορητός υπολογιστής. Μπορείτε ακόμη και να είστε πραγματικά τρελοί και να εκτελέσετε ένα VM που στη συνέχεια εκτελεί το Docker.

Τις περισσότερες φορές όταν χρησιμοποιώ το Docker το χρησιμοποιώ για τη συσκευασία και τη διανομή μιας εφαρμογής. Μερικές φορές το χρησιμοποιώ για κάτι πιο δροσερό, όπως ένα διανεμημένο πρόγραμμα υπολογιστών. Αλλά πολλές φορές ρίχνω ένα Dockerfile σε ένα repo GitHub, έτσι ώστε να μην χρειάζεται να εγκαταστήσω CLIs που απλά ξέρω ότι τελικά θα έρχονται σε διένεξη στον φορητό υπολογιστή μου.

Με λίγα λόγια, μπορείτε να πείτε στον Docker να εκτελέσει την εντολή bash, η οποία σας ρίχνει σε ένα κέλυφος:

docker run -it name-of-image bash # docker run -it continuumio/miniconda3:latest bash # docker run -it node:latest bash

Αλλά συνεχίστε να διαβάζετε για περισσότερα. ;-)

Δοκίμασέ το

Google, η αγαπημένη σας γλώσσα προγραμματισμού Docker up. Για μένα αυτό είναι το Python και συγκεκριμένα μου αρέσει το conda. Στη συνέχεια, εκτελέστε μερικές εντολές για να βεβαιωθείτε ότι είστε στην πραγματικότητα σε αυτό το κέλυφος.

# From Host echo $(pwd) # Drop into docker shell docker run -it continuumio/miniconda3:latest bash # Now you are in the docker shell! echo $(pwd) echo $USER

Ωραίο, ε; Αυτό είναι ιδανικό για τον εντοπισμό σφαλμάτων ενός κοντέινερ που πρέπει απολύτως να λειτουργεί σωστά. Είναι επίσης εξαιρετικό για την πιο συνηθισμένη θήκη χρήσης "Δεν θέλω να το εγκαταστήσω στον υπολογιστή μου".

Εντοπισμός σφαλμάτων Docker Build με Docker Run

Το να αντιμετωπίζετε την εικόνα του Docker σαν ένα κανονικό κέλυφος θα είναι χρήσιμο όταν προσπαθείτε να εντοπίσετε σφάλματα στο Docker.

Ας υποθέσουμε ότι έχετε ένα Dockerfile για μια εικόνα που προσπαθείτε να δημιουργήσετε. Κανονικά, αυτό που συμβαίνει είναι ότι όταν εκτελείται docker build -t my-image .(-t is for tag), το Docker θα τρέχει σε κάθε ένα από τα βήματα RUN και θα σταματά όταν φτάνει σε μια εντολή που δεν θα βγεί σωστά.

Σε ένα κέλυφος UNIX, ο κωδικός εξόδου 0 σημαίνει ότι όλα είναι καλά με μια εντολή. Για να διευκρινίσω αυτό το σημείο έχω κάνει το Dockerfile να έχει μια εντολή RUN που βγαίνει με 1.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes RUN exit 1
docker build -t my-image .

Αυτό θα σας δώσει μια έξοδο που μοιάζει με:

(base) ➜ my-image docker build -t my-image . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/4 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/4 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Step 4/4 : RUN exit 1 ---> Running in 7c98aab6b52c The command '/bin/sh -c exit 1' returned a non-zero code: 1

Μπορείτε να επιβεβαιώσετε ότι η εικόνα Docker δεν δημιουργήθηκε εκτελώντας docker imagesκαι ελέγχοντας my-image. Δεν θα είναι εκεί γιατί δεν κατασκευάστηκε με επιτυχία.

Τώρα αυτό που μπορούμε να κάνουμε είναι να σχολιάσουμε την ενοχλητική εντολή Dockerfile RUN.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes #RUN exit 1

Τότε αυτό που θα δείτε είναι:

Sending build context to Docker daemon 2.048kB Step 1/3 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/3 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/3 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Successfully built 19478bb3ce67 Successfully tagged my-image:latest 

Τώρα μπορείτε να μεταβείτε στην εικόνα Docker και να ξεκινήσετε αλληλεπιδραστικά να εκτελείτε εντολές!

docker run -it my-image bash # you can also run # docker run -it my-image:latest bash

Από εδώ, ένα προς ένα, μπορείτε να ξεκινήσετε τον εντοπισμό σφαλμάτων των εντολών RUN για να δείτε τι πήγε στραβά. Εάν δεν είστε βέβαιοι εάν μια εντολή τερματίστηκε σωστά ή όχι, εκτελέστε $?:

# First run docker run -it my-image bash to get to the shell # Print the string hello echo "hello" # hello echo $? # 0 # Run a non existant command hello $(hello) # bash: hello: command not found echo $? # 127

Μπορείτε να συνεχίσετε να εκτελείτε αυτά τα βήματα, σχολιάζοντας το Dockerfile, ρίχνοντας σε ένα κέλυφος και υπολογίζοντας προβληματικές εντολές, έως ότου οι εικόνες του Docker δημιουργηθούν τέλεια.

Τύλιξε

Ας ελπίσουμε ότι σας έδειξα ότι η χρήση μιας εικόνας Docker δεν διαφέρει από το τερματικό στον υπολογιστή σας. Η χρήση εικόνων Docker είναι ένας καταπληκτικός τρόπος διανομής εφαρμογών.

Προσπαθήστε να πάρετε την αγαπημένη σας εφαρμογή CLI ή το επόμενο έργο GitHub και αντί να δημιουργήσετε ένα σενάριο εγκατάστασης, συσκευάστε το με το Docker. ;-)