🐳 Интерактивный режим Docker после выполнения скрипта

by itisgood

Обзор

При использовании контейнеров Docker иногда возникает необходимость выполнить команду, например, запустить скрипт внутри контейнера, а затем получить доступ к контейнеру для отладки или проверки, не запуская скрипт вручную.

В этом руководстве мы рассмотрим, как использовать интерактивный режим Docker после выполнения скрипта

🐳 Почему ‘init’ не является допустимой командой Docker в стандартном Docker

Использование Docker для интерактивного режима и выполнения команд

Docker позволяет нам выполнять команду и поддерживать интерактивный доступ к контейнеру в одной и той же сессии.

Комбинируя выполнение команды с интерактивным режимом, мы можем запустить контейнер, в котором скрипт выполняется автоматически при запуске, а затем получить интерактивный доступ к запущенному контейнеру.

Обычно это происходит для:

  • Отладки
  • Проверка состояния приложения
  • Внесения ручных изменений или проверки окружения.

Давайте посмотрим, как можно запускать контейнеры, выполняя скрипты и получая доступ к контейнеру.

Запуск в интерактивном режиме

Если мы хотим выделить терминал и сохранить контейнер живым для интерактивного доступа, мы можем использовать run с опцией -it.

Мы можем попробовать это с образом hello-world от Docker:

$ docker run -it hello-world -n hello

Давайте разберем эту команду:

  • docker run: Это основная команда для запуска контейнера из указанного образа. Если мы не укажем имя (параметр -n или –name), docker создаст его за нас.
  • -i (interactive): Эта опция оставляет открытым стандартный вход контейнера (STDIN), позволяя нам взаимодействовать с запущенным контейнером даже после выполнения скрипта.
  • -t (pseudo-TTY): Выделяет терминальный интерфейс, необходимый для интерактивных процессов, таких как оболочка Bash. Он позволяет нам видеть вывод и взаимодействовать с контейнером как с терминалом.

Создание в интерактивном режиме и запуск

Мы также можем сначала создать интерактивный контейнер, а затем запустить его.

Это более разумный подход, поскольку при желании мы можем подключить несколько сессий Bash к одному контейнеру.

Сначала мы создадим контейнер:

$ docker create -it hello-world --name hello

Затем, во-вторых, мы запускаем его:

$ docker start hello

Выполнение команд и Bash

У нас есть несколько вариантов выполнения команд и взаимодействия с оболочкой Bash в контейнере, что мы подробно рассмотрим позже на примере.

Однако мы можем добавить команду во время работы контейнера с помощью опции sh -c.

Например, если мы хотим запустить простой Python-принт:

$ docker run -it python:3.9-slim sh -c "python -c 'print(\"Hello from Python\")' && exec bash"

Давайте разберем опцию sh -c.

Она использует && для объединения нескольких команд в цепочку:

  • python -c: Это выполнит команду Python.
  • exec bash: Эта команда откроет оболочку Bash, что позволит нам продолжить работу в интерактивном режиме.

Позже мы также увидим, как применить эту команду в Dockerfile.

Давайте посмотрим на выполнение команды Docker, где мы видим вывод Python и приглашение к оболочке:

Hello from Python
root@1dbf38668053:/#

Примеры интерактивного режима и выполнения скрипта

Теперь давайте посмотрим, как выполнить скрипт во время работы контейнера и получить доступ к нему для проверки.

Мы будем использовать Dockerfile или просто командную строку.

Использование Dockerfile

Чтобы продемонстрировать это, давайте создадим скрипт на Python для запуска внутри контейнера:

# script.py

# Add any changes here
# For example, creating a file in the container
with open("/app/output.txt", "w") as f:
    f.write("This file was created by script.py inside the Docker container.\n")

Файл script.py создаст файл output.txt с некоторым текстом.

Давайте посмотрим пример Dockerfile:

# Use a Python base image
FROM python:3.9-slim

# Set the working directory inside the container
WORKDIR /app

# Copy the Python script into the container
COPY script.py .

# Run the Python script and then drop into an interactive shell
CMD ["sh", "-c", "python script.py && exec bash"]

Теперь мы можем создать наш образ:

$ docker build -t python-interactive-mode .

Теперь мы можем запустить наш контейнер:

$ docker run -it python-interactive-mode

Как мы видели ранее, мы также можем запустить наш контейнер:

docker create -it --name python-interactive-mode python-interactive-mode && \
docker start python-interactive-mode

Примечательно, что в данном случае мы не обращаемся к оболочке Bash напрямую.

Поэтому нам нужно использовать команду exec:

$ docker exec -it python-interactive-mode bash

Использование ENTRYPOINT и CMD

В Dockerfile мы можем комбинировать ENTRYPOINT и CMD, чтобы скрипт всегда выполнялся первым, а интерактивная сессия Bash запускалась после.

🐳 Разница между ENTRYPOINT и CMD в Dockerfile

Это позволяет создавать более гибкие конфигурации для повторного использования нашего контейнера с различными сценариями.

Аналогично, давайте посмотрим, как мы можем обновить раздел CMD в Dockerfile:

ENTRYPOINT ["python", "script.py"]
CMD ["bash"]

Заключение

В этом руководстве мы рассмотрели, как запустить скрипт внутри контейнера Docker после его создания и получения доступа к shell-терминалу.

Мы создали Dockerfile или выполнили команду Docker в командной строке.

см. также:

Loading

You may also like

Leave a Comment