Docker Exec - Sådan køres en kommando inde i et Docker-billede eller container

Jeg vil give dig ind på en DevOps-hemmelighed her: Den ting, som alle DevOpsy-folk elsker at gøre er at opbygge et superfantastisk og komplekst system og derefter finde en måde at håndtere det på som en almindelig skal. Eller opret forbindelse til det med SSH og behandl det derefter som en almindelig skal.

Docker er ikke anderledes! Du kører en computer inde i en anden computer. Måske er den computer en EC2-forekomst eller en bærbar computer. Du kan endda blive virkelig skør og køre en VM, der derefter kører Docker.

Det meste af tiden, når jeg bruger Docker, bruger jeg den til at pakke og distribuere en applikation. Nogle gange bruger jeg det til noget køligere som et distribueret computerprojekt. Men mange gange kaster jeg en Dockerfile i en GitHub repo, så jeg ikke behøver at installere CLI'er, som jeg bare ved, i sidste ende vil komme i konflikt med min bærbare computer.

Lang historie kort, du kan fortælle Docker at køre kommandoen bash, som smider dig ned i en skal:

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

Men fortsæt med at læse for mere. ;-)

Prøve det

Google dit foretrukne programmeringssprog Docker op. For mig er dette Python, og specifikt kan jeg lide konda. Kør derefter et par kommandoer for at sikre dig, at du faktisk er i den skal.

# 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

Sejt, hva '? Dette er perfekt til fejlfinding af en container, der absolut skal fungere korrekt. Det er også fantastisk til min mest almindelige brugssag "Jeg ønsker ikke at installere dette på min computer".

Fejlfind en Docker-bygning med Docker Run

Behandling af dit Docker-billede som en almindelig shell vil være praktisk, når du prøver at debugge Docker-builds.

Lad os sige, at du har en Dockerfil til et billede, du prøver at bygge. Normalt sker der, at når du kører docker build -t my-image .(-t er til tag), vil Docker løbe gennem hvert af dine KØR-trin og stoppe, når det kommer til en kommando, der ikke afslutter korrekt.

I en UNIX-skal betyder udgangskoden 0, at alt er godt med en kommando. Så for at illustrere dette punkt har jeg fået vores Dockerfile til at have en RUN-kommando, der afsluttes med 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 .

Dette giver dig en output, der ligner:

(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

Du kan bekræfte, at dit Docker-billede ikke blev bygget ved at køre docker imagesog kontrollere my-image. Det vil ikke være der, fordi det ikke blev bygget med succes.

Hvad vi nu kan gøre er at kommentere den besværlige Dockerfile RUN-kommando.

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

Så hvad du vil se er:

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 

Du kan nu falde ind i dit Docker-billede og starte interaktivt kørende kommandoer!

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

Herfra, en efter en, kan du begynde at debugge dine RUN-kommandoer for at se, hvad der gik galt. Hvis du ikke er sikker på, om en kommando afsluttes korrekt eller ej, skal du køre $?:

# 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

Du kan fortsætte med at køre disse trin, kommentere din Dockerfile, falde ned i en shell og finde ud af problematiske kommandoer, indtil dine Docker-billeder bygger perfekt.

Pak ind

Forhåbentlig har jeg vist dig, at brug af et Docker-billede ikke adskiller sig fra terminalen på din computer. Brug af Docker-billeder er en fantastisk måde at distribuere applikationer på.

Prøv at tage dit foretrukne CLI-program eller næste GitHub-projekt, og i stedet for at oprette et installationsscript skal du pakke det sammen med Docker. ;-)