Когда ваш docker-compose.yml
файл говорит:
entrypoint: /bin/bash -c "/run-node.sh"
Поскольку это пустая строка, Docker помещает ее в оболочку /bin/sh -c
. Таким образом, основной процесс вашего контейнера выглядит примерно так:
/bin/sh -c '/bin/bash -c "/run-node.sh"'
В свою очередь, скрипт bash продолжает работать. Он запускает скрипт Python и продолжает работать как родитель, пока этот скрипт не завершится. (Два уровня sh -c
упаковщиков могут работать или не работать).
Важной частью здесь является то, что эта оболочка-оболочка, а не ваш скрипт, является основным контейнерным процессом, который получает сигналы, и (оказывается) не получит SIGTERM, если он явно не закодирован в .
Самая важная реструктуризация, которую необходимо выполнить, - это ваш скрипт-обертка exec скрипт Python. Это приводит к тому, что он заменяет оболочку, поэтому он становится основным процессом и получает сигналы. Если больше ничего не измените последнюю строку на
exec python3 /nodes/mynode.py
скорее всего поможет.
Я хотел бы пойти немного дальше и убедиться, что большая часть этого кода встроена в ваш образ Docker, и попытаться минимизировать количество явных оболочек оболочки. «Выполните некоторую инициализацию, затем exec
что-то» - это чрезвычайно распространенный шаблон Docker, и вы можете написать этот сценарий и сделать его точкой входа вашего изображения:
#!/bin/sh
# Do the setup
# ("." is the same as "source", but standard)
. "/opt/ros/$ROS_DISTRO/setup.bash"
# Run the main CMD
exec "$@"
Точно так же ваш основной скрипт должен начинаться со строки "shebang", как
#!/usr/bin/env python3
import ...
Ваш Dockerfile уже содержит настройку, позволяющую запускать оболочку напрямую, вам может понадобиться аналогичная строка RUN chmod
для основного скрипта. Но тогда вы можете добавить
ENTRYPOINT ["/run-node.sh"]
CMD ["/nodes/my-node.py"]
Поскольку оба скрипта являются исполняемыми и имеют строки "shebang", вы можете запускать их напрямую. Использование синтаксиса JSON удерживает Docker от добавления дополнительной оболочки оболочки. Поскольку ваш скрипт точки входа теперь будет работать независимо от команды, это легко изменить отдельно. Например, если вы хотите, чтобы интерактивная оболочка, которая выполнила настройку переменной среды, пыталась отладить запуск вашего контейнера, вы можете переопределить только часть команды
docker run --rm -it mynode sh