Docker Exec - Як запустити команду всередині зображення Docker або контейнера

Я збираюся повідомити вас про секрет DevOps тут: Все, що люблять люди DevOpsy, - це створити надзвичайно вигадливу та складну систему, а потім знайти спосіб боротися з нею, як із звичайною оболонкою. Або підключіться до нього за допомогою SSH, а потім обробляйте його як звичайну оболонку.

Докер не відрізняється! Ви працюєте з комп’ютером всередині іншого комп’ютера. Можливо, цей комп’ютер є екземпляром 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 за допомогою Docker Run

Поводження зі своїм образом Docker як зі звичайною оболонкою стане в нагоді при спробі налагодити збірки Docker.

Скажімо, у вас є файл Docker для зображення, яке ви намагаєтеся створити. Зазвичай відбувається те, що під час запуску 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

Ви можете продовжувати виконувати ці кроки, коментуючи свій файл Docker, потрапляючи в оболонку та розгадуючи проблемні команди, поки ваші зображення Docker не будуються ідеально.

Загорнути

Сподіваюся, я показав вам, що використання образу Docker нічим не відрізняється від терміналу на вашому комп'ютері. Використання зображень Docker - це чудовий спосіб розповсюдження програм.

Спробуйте взяти улюблену програму CLI або наступний проект GitHub, і замість того, щоб створювати сценарій встановлення, пакуйте його за допомогою Docker. ;-)