Оркестровка и очистка контейнера Google Cloud - PullRequest
0 голосов
/ 24 октября 2018

Короче говоря, я смотрю, возможно ли запустить несколько контейнеров Docker на одной машине с помощью функции create-with-container gcloud (или аналогичной).Идея состоит в том, что будет некоторый «рабочий» контейнер (который выполняет некоторую произвольную работу), который будет запускаться и завершаться, за которым следует «очистительный» контейнер, который впоследствии выполняется, выполняя одну и ту же задачу каждый раз.

Более подробное объяснение:

В настоящее время у меня есть приложение, которое запускает задачи, которые запускаются в контейнерах Docker в Google Cloud.Я использую gcloud beta compute instances create-with-container <...other args...> для запуска виртуальной машины, которая запускает указанный контейнер.Я назову этот «рабочий» контейнер и выполняемые им задачи не относящимися к моему вопросу.Однако, независимо от «рабочего» контейнера, я хотел бы запустить второй «очистить» контейнер после завершения первого.Таким образом, разработчики могут самостоятельно писать контейнеры Docker, которые не должны «повторять» работу, выполняемую контейнером «cleanup».

Примечание :

Я знаю, что я мог бы альтернативно указать сценарий запуска (например, сценарий bash), который запускает контейнеры Docker, как я описал выше.Однако, когда я впервые попробовал это, я продолжал сталкиваться с проблемами, когда команда docker pull <image> по какой-то причине зависала или не работала при соединении с dockerhub.gcloud beta compute instances create-with-container <...args...>, казалось, имел встроенную обработку ошибок / повторных попыток, что казалось идеальным.У кого-нибудь есть рабочий фрагмент, который обеспечивал бы относительно надежную обработку ошибок в скрипте запуска?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Ответ : В настоящее время невозможно запустить несколько контейнеров с функциональностью create-with-container.

Альтернатива : Вы упомянули, что уже пытались запустить свойконтейнеры со скриптом запуска.Другим вариантом будет указать cloud-init config через метаданные экземпляра .Cloud-init встроен в оптимизированную для контейнеров ОС (ту же ОС, которую вы используете с create-with-container).

Он работает путем добавления и запуска службы systemd, что означает, что вы можете:

  • укажите, что ваша служба должна запускаться после других служб: network-online.target и docker.socket
  • укажите Политика перезапуска , чтобы служба делала попытки при сбое,
  • добавить ExecStopPost спецификацию для запуска очистки (или добавить отдельную службу для этого в конфигурации cloud-init)

Это фрагмент кода, который может быть начальнымточка (вам нужно добавить ее в user-data ключ метаданных):

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container
    Wants=network-online.target docker.socket
    After=network-online.target docker.socket

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=cloudservice busybox:latest /bin/sleep 180
    ExecStopPost=/bin/echo Finished!
    Restart=on-failure
    RestartSec=30

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service
0 голосов
/ 25 октября 2018

Насколько я знаю, ограничение - один контейнер на экземпляр ВМ.См. ограничения .

...