Я бы предложил написать собственный сценарий точки входа для обработки этого случая.
Как правило, в большинстве случаев предпочтительнее использовать от CMD
до ENTRYPOINT
. В частности, шаблон отладочной оболочки
docker run --rm -it myimage sh
действительно полезен, и использование ENTRYPOINT
для запуска вашего основного приложения ломает это. Шаблон сценария точки входа, который я собираюсь описать, также очень полезен в целом, и его легко добавить, если ваш основной контейнерный процесс описан с помощью CMD
.
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["node", "dist/main.js"]
Сам сценарий является обычным сценарием оболочки, который передается CMD
в качестве аргументов командной строки. Обычно он заканчивается на exec "$@"
для фактического запуска CMD
в качестве основного процесса контейнера.
Поскольку сценарий точки входа является сценарием оболочки и ему передается команда из командной строки docker run
в качестве аргументов, вы можете выполнить его динамическое переключение и удовлетворить оба ваших требования, чтобы просто иметь возможность передавать дополнительные параметры в ваш скрипт, а также мое требование иметь возможность запускать произвольные программы вместо приложения Node.
#!/bin/sh
if [ $# = 1 ]; then
# no command at all
exec node dist/main.js
else
case "$1" of
-*) exec node dist/main.js "$@" ;;
*) exec "$@" ;;
esac
fi