Перезапустите Docker-контейнер при сбое внутреннего процесса - PullRequest
1 голос
/ 13 июня 2019

Редактировать

Ответ - просто перезапустить контейнер при сбое. В процессе разработки я использую nodemon, который предотвращает выход процесса при сбое, поэтому я предположил, что сбой процесса не привел к выходу контейнера. Виноват. Сбой процесса фактически приводит к выходу контейнера при использовании node, а не nodemon.

{
  "scripts": {
    "development:service": "nodemon ./service/server.js",
    "production:service": "node ./service/server.js"
  }
}

Оригинальный вопрос

Как перезапустить докер-контейнер, когда процесс внутри контейнера падает?

Будет ли лучший способ установить --autorestart ON_FAILURE для контейнера, а затем вызвать сбой контейнера при сбое внутреннего процесса? Если да, то как заставить контейнер аварийно завершить работу, когда происходит сбой одного из его процессов?

Я использую изображение node:10.15.3.

Полезная ссылка: как перезапустить контейнер, если сам контейнер аварийно завершает работу

Dockerfile

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.js

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вы можете использовать флаг --restart для команды запуска docker https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart

Пример: docker run --restart=on-failure my-image-name

Или, если вы используете docker-compose, вы restart: on-failure дляуслуга https://docs.docker.com/compose/compose-file/#restart

1 голос
/ 13 июня 2019

Когда вы запускаете несколько сервисов в контейнере, и вы очень, очень уверены, что хотите этого (рекомендуется запускать один процесс в одном контейнере), вам может потребоваться супервизор процесса (например, systemd) которые перезапускают любой сбойный процесс внутри, или сбой, если происходит сбой любого из контролируемых им процессов.

Существуют и другие, более легкие способы для достижения этой цели, например сценарий оболочки-оболочки.

Здесь все описано: https://docs.docker.com/config/containers/multi-service_container/

Изменить после обновления вопроса с помощью Dockerfile:

Самый простой способ - это убедиться, что run.sh аварийно завершает работу, если происходит сбой любого из его подпроцессов. Затем контейнер аварийно завершит работу и, при необходимости, перезапустится, если вы используете --restart=on-failure в docker run.

...