Ничто из того, что вы показываете, на самом деле не запускает демон Docker (кроме того, который работает на хосте).
Попытка запустить Docker в Docker - сложная и обычно не рекомендуемая установка. Давний разработчик Docker особо рекомендует не использовать его для CI ; есть предустановленное докер изображение, где начинается самое первое предложение официального описания изображения
Хотя запуск Docker внутри Docker, как правило, не рекомендуется ....
Показываемый вами Dockerfile не содержит директиву ENTRYPOINT или CMD. Это означает, что он унаследует его от узла , для которого по умолчанию CMD просто выполняет node
. Короче говоря: когда вы запускаете этот образ, если вы не укажете что-либо еще в командной строке, он запустит интерактивную оболочку Node.js, а не любые не связанные инструменты, которые вы вложили в одно и то же изображение. В частности, он не запустит демон Docker.
Помещение RUN service ... start
в ваш Dockerfile не поможет вам по нескольким причинам. Один из них заключается в том, что образы Docker содержат только содержимое файловой системы, а не запущенные процессы, поэтому после завершения шага RUN больше ничего не выполняется. Некоторые системы инициализации (особенно systemd) зависят от взаимодействия с процессом init, который также не будет запущен, поэтому особенно systemctl
в Docker почти никогда не работает. С архитектурной точки зрения обычно лучше запускать один процесс в контейнере (поэтому docker stop
остановит интересующий вас процесс, и поэтому Docker заметит, что процесс завершится сбоем, а также для масштабирования и ...), поэтому вы почти никогда не должны использовать service
, initctl
или systemctl
в Docker.
Общий совет для инструментов CI заключается в том, чтобы связать монтируемое гнездо Docker хоста (docker run -v /var/run/docker.sock:/var/run/docker.sock
) и позволить ему создавать образы и запускать контейнеры самостоятельно, принимая во внимание последствия для безопасности.