La respuesta es simplemente configurar el contenedor para que se reinicie en caso de bloqueo. En desarrollo, estoy usando nodemon, que evita que el proceso se cierre en caso de bloqueo, por lo que supuse que el bloqueo del proceso no provocó la salida del contenedor. Mi error. El bloqueo del proceso, de hecho, hace que el contenedor se cierre cuando se usa node y no nodemon .
{ "scripts": { "development:service": "nodemon ./service/server.js", "production:service": "node ./service/server.js" } }¿Cómo reinicio un contenedor docker cuando falla un proceso dentro del contenedor?
¿La mejor manera sería configurar --autorestart ON_FAILURE para el contenedor y luego hacer que el contenedor se bloquee cuando el proceso interno se bloquee? Si es así, ¿cómo obligo al contenedor a bloquearse cuando uno de sus procesos falla?
Estoy usando el node:10.15.3 .
Enlace útil: cómo hacer que un contenedor se reinicie si el mismo contenedor falla
FROM node:10.15.3 ENV NODE_ENV development # Create application directory. RUN mkdir -p /src WORKDIR /src # Install app dependencies and build. ADD . /src RUN yarn install --force RUN ["chmod", "+x", "./run.sh"] CMD [ "./run.sh" ] USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND user 13 0.0 0.1 17952 2840 ? S 15:09 0:00 bash ./install.sh user 72 0.5 3.2 889668 66728 ? Sl 15:09 0:00 /usr/local/bin/node /opt/yarn-v1.13.0/bin/yarn.js start user 97 2.4 3.2 919992 65748 ? Sl 15:09 0:01 /usr/local/bin/node ./service/server.jsPuede usar el indicador --restart para el comando de ejecución de docker https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart
Ejemplo: docker run --restart=on-failure my-image-name
O si está utilizando docker-compose, restart: on-failure para el servicio https://docs.docker.com/compose/compose-file/#restart
Cuando ejecuta varios servicios en un contenedor y está muy, muy seguro de que desea esto (lo mejor es ejecutar un solo proceso en un solo contenedor), es posible que desee un supervisor de procesos (por ejemplo, systemd ) que reinicie cualquier proceso bloqueado. dentro, o fallar si alguno de sus procesos supervisados falla.
También hay otras formas, más livianas, de lograr esto, como un script bash de contenedor.
Todo se describe aquí: https://docs.docker.com/config/containers/multi-service_container/
Editar después de que la pregunta se actualizó con Dockerfile:
La forma más fácil es probablemente asegurarse de que run.sh se bloquee si alguno de sus subprocesos se bloquea. Luego, el contenedor se bloqueará y, opcionalmente, se reiniciará si usa --restart=on-failure en docker run .