Eu só quero executar um script quando o sistema for iniciado e, depois de muitas tentativas e seguindo vários tutoriais e documentação, não consigo fazer isso.
Você poderia identificar o que estou fazendo de errado?
Execute o Ubuntu 20.04 na janela de encaixe:
docker run -d --name daemon ubuntu:20.04 tail -f /dev/null
Conecte-se a ele:
docker exec -it daemon /bin/bash
Escrever /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;
Defina permissões e ative o serviço:
chmod 755 /etc/init.d/test
update-rc.d test defaults 91
update-rc.d test enable
Verifique se realmente funciona:
service test restart
service test status
Deve produzir:
stop
start
Remova o arquivo de log e saia da sessão:
rm -rf /var/log/test.log
exit
Reinicie o contêiner e conecte-se a ele novamente:
docker restart daemon
docker exec -it daemon /bin/bash
Verifique se o serviço está realmente ativo:
service --status-all
Infelizmente, nunca foi executado:
root@407a8e2c90ee:/# service test status
cat: /var/log/test.log: No such file or directory
Parece que o RC está bem:
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
Responder1
o que entendi da sua pergunta: você deseja iniciar um contêiner ubuntu:20.04 e dentro desse contêiner deve iniciar um serviço adicional.
- é ótimo ter você na família dos apoiadores de containers.
- o problema que você descreve não está relacionado ao Ubuntu, é o comportamento padrão dos contêineres.
- ao iniciar um contêiner, um único script é executado, no seu caso
tail -f /dev/null
- nada mais. um contêiner do Ubuntu não é uma VM do Ubuntu completa! - o processo normal de inicialização do Ubuntu não acontece dentro de um contêiner. seu serviço nunca é tocado. Como proceder:
- em vez de usar
docker run ...
recomendo fazer checkoutdocker-compose
e a sintaxe dodocker-compose.yaml
arquivo - verifique o parâmetro
command
ouentrypoint