Добавьте проверку в начало вашего скрипта Entrypoint
Docker действительно должен реализовать это как новую функцию, но вот еще один вариант обходного пути для ситуаций, в которых у вас есть точка входа, которая завершается после успеха или сбоя, что может затруднить отладку.
Если у вас еще нет сценария Entrypoint, создайте тот, который выполняет все команды, которые вам нужны для вашего контейнера. Затем в верхней части этого файла добавьте эти строки в entrypoint.sh
:
# Run once, hold otherwise
if [ -f "already_ran" ]; then
echo "Already ran the Entrypoint once. Holding indefinitely for debugging."
cat
fi
touch already_ran
# Do your main things down here
Чтобы убедиться, что cat
соединение удерживается, вам может потребоваться предоставить TTY. Я запускаю контейнер с моим скриптом Entrypoint следующим образом:
docker run -t --entrypoint entrypoint.sh image_name
Это приведет к тому, что скрипт будет запущен один раз, создав файл, который указывает, что он уже запущен (в виртуальной файловой системе контейнера). Затем вы можете перезапустить контейнер для выполнения отладки:
docker start container_name
Когда вы перезапустите контейнер, already_ran
файл будет найден, в результате чего скрипт Entrypoint остановится cat
(который просто вечно ожидает ввода, который никогда не поступит, но сохраняет контейнер живым). Затем вы можете выполнить bash
сеанс отладки :
docker exec -i container_name bash
Во время работы контейнера вы также можете удалить already_ran
и вручную запустить entrypoint.sh
сценарий для его повторного запуска, если вам необходимо выполнить отладку таким способом.