es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El servicio de systemd no funciona en docker.

Mi ambiente está bajo la imagen de Docker (Ubuntu 20.04), y quiero usar systemd para iniciar mi servicio después de cada vez que inicio mi docker, tengo mi propio archivo .service aquí:

/etc/systemd/system/my.service:

[Unit]
Description=my test
Documentation=man:test auto(8) man:test_config(5)

[Service]
ExecStart=/root/test.sh
Type=oneshot

[Install]
WantedBy=multi-user.target

/root/test.sh ha sido chmod 777:

#!/bin/bash

echo “hello~” > /usr/local/test.log
exit 0

Y he realizado las siguientes operaciones:

systemctl enable my.service
systemctl enable my.service
docker stop mydocker
docker start mydocker
docker exec -it mydocker bash

Pero después de iniciar mi docker, no vi que /root/test.sh se ejecutara, y verifiqué el estado del servicio de esta manera:

my.service – my test auto
Loaded: loaded (/etc/systemd/system/my.service, enabled)
Active: inactive (dead)

Disparar manualmente el servicio está bien:

root@:/# systemctl start my.service
root@:/# cat /usr/local/test.log
hello~

¿Omití algo? ¿O systemd no funciona bien en Docker?

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Usando systemd para iniciar un servicio después de iniciar un contenedor Docker

    Si deseas utilizar systemd para iniciar un servicio después de cada vez que inicies tu contenedor Docker, debes asegurarte de que tu contenedor Docker se ejecute con systemd habilitado.

    Para hacer esto, puedes crear un Dockerfile personalizado que instale y habilite systemd, o puedes utilizar una imagen preconstruida que ya tenga systemd instalado y habilitado.

    Suponiendo que ya hayas realizado este paso, lo siguiente que debes hacer es copiar tu propio archivo .service al directorio /etc/systemd/system del contenedor Docker.

    Una vez que hayas hecho esto, debes habilitar el servicio utilizando el siguiente comando:

    systemctl enable my.service
    

    Esto creará un enlace simbólico de tu archivo .service en el directorio /etc/systemd/system/multi-user.target.wants.

    El siguiente paso es detener y reiniciar tu contenedor Docker. Una vez que tu contenedor esté en ejecución, puedes verificar el estado de tu servicio utilizando el siguiente comando:

    systemctl status my.service
    

    Si tu servicio está inactivo (muerto), significa que no se inició automáticamente por systemd. Para iniciarlo manualmente, puedes utilizar el siguiente comando:

    systemctl start my.service
    

    Esto debería iniciar tu servicio y deberías ver la salida en el archivo /usr/local/test.log.

    Si aún no puedes hacer que tu servicio se inicie automáticamente, es posible que haya un problema con systemd en tu contenedor Docker. Puedes intentar solucionar el problema revisando los registros de systemd (/var/log/syslog) o haciendo que tu servicio se ejecute manualmente utilizando el comando systemd-run:

    systemd-run /root/test.sh
    

    Esto debería iniciar tu servicio y deberías poder ver cualquier mensaje de error en la salida.

Comments are closed.