Определите, должен ли Docker запускать или запускать контейнер при запуске - используя systemd, но он продолжает распространять ошибки - как остановить? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать сценарий запуска на экземпляре Google Compute Engine для:

  1. Если контейнер док-станции с именем rstudio присутствует, но в остановленном состоянии, выполните docker start rstudio
  2. Если нет док-контейнера, запустите rstudio run --name=rstudio rocker/rstudio

Из этого SO Я думал, что это может быть достигнуто с помощью docker top rstudio || docker run --name=rstudio rocker/rstudio, но, похоже, всегда ошибка приdocker top rstudio часть.В этом случае я попытался передать по трубопроводу docker top rstudio &>/dev/null, но безрезультатно.

У меня есть облачная конфигурация, которая запускается при загрузке экземпляра.

Моя проблема в том, что скрипт запускается илиstart контейнер продолжает регистрироваться как ошибка и не переходит к логике вытягивания изображения.Я попытался поместить его в отдельный скрипт bash и напрямую через ExecStart - также поместив "-" перед командой ExecStart (которая должна игнорировать ошибки?), Но это также, похоже, не имеет никакого эффекта.Вот где я оказался:

#cloud-config

users:
- name: gcer
  uid: 2000

write_files:
- path: /home/gcer/docker-rstudio.sh
  permissions: 0755
  owner: root
  content: |
    #!/bin/bash

    echo "Docker RStudio launch script"
    if ! docker top rstudio &>/dev/null
    then
      echo "Pulling new rstudio"
      docker run -p 80:8787 \
                 -e ROOT=TRUE \
                 -e USER=%s -e PASSWORD=%s \
                  -v /home/gcer:/home/rstudio \
                  --name=rstudio \
                  %s
    else
      echo "Starting existing rstudio"
      docker start rstudio
    fi

- path: /etc/systemd/system/rstudio.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=RStudio Server
    Requires=docker.service
    After=docker.service

    [Service]
    Restart=always
    Environment="HOME=/home/gcer"
    ExecStartPre=/usr/share/google/dockercfg_update.sh
    ExecStart=-/home/gcer/docker-rstudio.sh
    ExecStop=/usr/bin/docker stop rstudio

runcmd:
- systemctl daemon-reload
- systemctl start rstudio.service

Что бы я ни пытался, я получаю этот журнал ошибок при запуске sudo journalctl -u rstudio.service

Feb 14 23:26:09 test-9 systemd[1]: Started RStudio Server.
Feb 14 23:26:09 test-9 docker[770]: Error response from daemon: No such container: rstudio
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Control process exited, code=exited status=1
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Unit entered failed state.
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Failed with result 'exit-code'.
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Service hold-off time over, scheduling restart.
Feb 14 23:26:09 test-9 systemd[1]: Stopped RStudio Server.
Feb 14 23:26:09 test-9 systemd[1]: Starting RStudio Server...
...
Feb 14 23:26:09 test-9 systemd[1]: Started RStudio Server.
Feb 14 23:26:09 test-9 docker[809]: Error response from daemon: No such container: rstudio
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Control process exited, code=exited status=1
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Unit entered failed state.
Feb 14 23:26:09 test-9 systemd[1]: rstudio.service: Failed with result 'exit-code'.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Service hold-off time over, scheduling restart.
Feb 14 23:26:10 test-9 systemd[1]: Stopped RStudio Server.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Start request repeated too quickly.
Feb 14 23:26:10 test-9 systemd[1]: Failed to start RStudio Server.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Unit entered failed state.
Feb 14 23:26:10 test-9 systemd[1]: rstudio.service: Failed with result 'exit-code'.

Может кто-нибудь помочь мне заставить это работать

1 Ответ

0 голосов
/ 15 февраля 2019

Я бы удалил контейнер, когда вы его остановите.Затем ваш сценарий запуска сводится к тому, чтобы убедиться, что контейнер удален, и безоговорочно docker run обновляет его.

Это сделает все содержимое сценария следующим:

#!/bin/sh
docker stop rstudio
docker rm rstudio
docker run -p 80:8787 \
   --name=rstudio \
   ... \
   rstudio run --name=rstudio rocker/rstudio

БезОпция set -e, даже если предыдущие команды завершились неудачно (поскольку контейнер не существует), сценарий все равно перейдет к команде docker run.Это позволяет избежать любых попыток выяснить, существует ли контейнер или нет, и всегда оставляет вас в согласованном состоянии.

Аналогично, чтобы немного лучше очистить, я бы изменил файл модуля systemd, чтобы удалитьконтейнер после его остановки

ExecStop=/usr/bin/docker stop rstudio
ExecStopPost=/usr/bin/docker rm rstudio

(Ваша установка имеет три возможных состояния: контейнер работает; контейнер существует, но остановлен; и контейнер не существует. Моя установка удаляет «существует, носостояние "остановлено", которое не имеет большого значения, тем более что вы используете опцию docker run -v для хранения данных вне пространства контейнера.)

...