Docker Exec - Как да стартирате команда в изображение или контейнер на Docker

Ще ви запозная с тайна на DevOps тук: Нещото, което всички хора на DevOpsy обичат да правят, е да създаде супер изискана и сложна система, след което да намерите начин да се справите с нея като обикновена обвивка. Или се свържете с него със SSH и след това го третирайте като обикновена обвивка.

Docker не е по-различен! Работите с компютър в друг компютър. Може би този компютър е екземпляр EC2 или лаптоп. Можете дори да се побъркате и да стартирате виртуална машина, която след това работи с Docker.

По-голямата част от времето, когато използвам Docker, го използвам за пакетиране и разпространение на приложение. Понякога го използвам за нещо по-хладно като проект за разпределени изчисления. Но много пъти хвърлям Dockerfile в репозитория на GitHub, за да не се налага да инсталирам CLI, за които просто знам, че в крайна сметка ще се сблъскат с моя лаптоп.

Накратко, можете да кажете на 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 е за етикет) 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. Няма да го има, защото не е бил успешно изграден.

Сега това, което можем да направим, е да коментираме тази обезпокоителна команда RUN на Dockerfile.

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. ;-)