Обзор
При использовании контейнеров 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 в командной строке.
см. также:
- 🐳 Сравнение команд Docker Exec и Docker Attach
- 🐳 Использование if-else в Dockerfile
- 🐳 Понимание инструкции Dockerfile VOLUME
- 🐳 Размер образа Docker: как проверить и уменьшить