Я просто хочу выполнить скрипт при запуске системы, но после многих попыток и следования многочисленным руководствам и документации я не могу этого сделать.
Можете ли вы заметить, что я делаю неправильно?
Запустите Ubuntu 20.04 в Docker:
docker run -d --name daemon ubuntu:20.04 tail -f /dev/null
Подключитесь к нему:
docker exec -it daemon /bin/bash
Писать /etc/init.d/test
:
#!/bin/bash
### BEGIN INIT INFO
# Provides: Join the Swarm
# Default-Start: 4
# Default-Stop: 0 6
# Description: Join the Swarm
### END INIT INFO
start(){
/usr/bin/echo start >> /var/log/test.log
}
stop(){
/usr/bin/echo stop >> /var/log/test.log
}
case "$1" in
start)
start;;
stop)
stop;;
status)
cat /var/log/test.log;;
restart)
stop;
start;
;;
*);;
esac
exit 0;
Установите разрешения и включите службу:
chmod 755 /etc/init.d/test
update-rc.d test defaults 91
update-rc.d test enable
Проверьте, что это действительно работает:
service test restart
service test status
Должен быть выведен:
stop
start
Удалите файл журнала и выйдите из сеанса:
rm -rf /var/log/test.log
exit
Перезагрузите контейнер и подключитесь к нему снова:
docker restart daemon
docker exec -it daemon /bin/bash
Проверьте, действительно ли услуга активна:
service --status-all
К сожалению, это так и не было реализовано:
root@407a8e2c90ee:/# service test status
cat: /var/log/test.log: No such file or directory
Кажется, с RC все в порядке:
root@407a8e2c90ee:/# ls /etc/rc*.d
/etc/rc0.d:
K01test
/etc/rc1.d:
/etc/rc2.d:
/etc/rc3.d:
/etc/rc4.d:
S01test
/etc/rc5.d:
/etc/rc6.d:
K01test
/etc/rcS.d:
S01procps
решение1
что я понял из вашего вопроса: вы хотите запустить контейнер ubuntu:20.04 и внутри этого контейнера запустить дополнительную службу.
- здорово видеть вас в семье сторонников контейнеров.
- Описанная вами проблема не связана с Ubuntu, это поведение контейнеров по умолчанию.
- при запуске контейнера выполняется один скрипт, в вашем случае
tail -f /dev/null
- больше ничего. Контейнер Ubuntu не является полноценной виртуальной машиной Ubuntu! - обычный процесс загрузки ubuntu не происходит внутри контейнера. ваш сервис никогда не трогается. Как действовать:
- вместо использования
docker run ...
рекомендую проверитьdocker-compose
и синтаксисdocker-compose.yaml
файла - проверьте параметр
command
илиentrypoint