Google Cloud容器编排和清理

时间:2018-10-24 18:07:18

标签: google-cloud-platform google-compute-engine

简而言之,我想看看是否可以通过gcloud的create-with-container功能(或类似功能)在同一台机器上运行多个Docker容器。这个想法是,将有一个运行并完成的“工作”容器(完成一些任意工作),然后是一个“清理”容器,该容器随后每次运行以执行相同的任务。

更长的解释:

我目前有一个应用程序,可以启动在Google Cloud上的Docker容器中运行的任务。我使用gcloud beta compute instances create-with-container <...other args...>启动VM,该VM运行指定的容器。我将其称为“工人”容器,它执行的任务与我的问题无关。但是,无论“ worker”容器如何,我都想在第一个“清理”容器完成后运行。这样,开发人员可以独立编写Docker容器,而不必“重复”由“清理”容器完成的工作。

旁注

我知道我可以选择指定启动脚本(例如bash脚本)来启动Docker容器,如上所述。但是,当我第一次尝试这样做时,我一直遇到问题,docker pull <image>命令在与dockerhub通信时会由于某些原因而超时或失败。 gcloud beta compute instances create-with-container <...args...>似乎内置了错误处理/重试功能,这似乎很理想。是否有人能在启动脚本中提供相对健壮的错误处理功能?

2 个答案:

答案 0 :(得分:0)

据我所知,限制是每个VM实例一个容器。参见limitations

答案 1 :(得分:0)

答案:当前无法使用create-with-container功能启动多个容器。

替代:您提到您已经尝试使用启动脚本启动容器。另一种选择是指定一个cloud-init config through instance metadata。 Cloud-init内置在容器优化的OS(与create-with-container一起使用的OS)中。

它通过添加并启动systemd服务来工作,这意味着您可以:

  • 指定您的服务应在其他服务之后运行:network-online.targetdocker.socket
  • 指定Restart policy,以便服务在失败时重试,
  • 添加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