📦

Google CloudのContainer-Optimized OSでコンテナにディスクをマウントしようとしてハマった

2024/07/18に公開

背景

以下のような構成を取ろうとしたら、ディスクのマウントが完了する前にコンテナが起動してしまい意図する動作をしないという問題にぶつかったのでメモ。

  • Google Compute EngineでContainer-Optimized OSを利用。
  • データを永続化するため追加ディスクを作成し、インスタンスにアタッチ。
  • bootcmdを利用してディスクをインスタンスにマウント(参考)、およびコンテナのボリュームとして利用。

対応策

インスタンスの設定としてコンテナをデプロイするのではなく、cloud-init の例 についてのドキュメントを参考に、自身でコンテナをサービスとして起動するように設定する。

#cloud-config

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Cloud Service Docker Container
    Wants=gcr-online.target
    After=gcr-online.target

    [Service]
    Environment="HOME=/home/cloudservice"
    ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
    ExecStart=/usr/bin/docker run --rm --name=mycloudservice \
              -v /mnt/disks/service-data:/data \
              CONTAINER_IMAGE_NAME
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

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

bootcmd:
  - fsck.ext4 -tvy /dev/disk/by-id/google-ATTACHED_DISK_NAME
  - mkdir -p /mnt/disks/service-data
  - mount -t ext4 -o discard,defaults /dev/disk/by-id/google-ATTACHED_DISK_NAME /mnt/disks/service-data

こうすると runcmd が bootcmd より後に動くので、問題を解消できた(多分。。。ディスクが非常に大きかったりすると、きちんとExecStartPreなどでマウントチェックしないとダメかもしれない)

Discussion