Search code examples
dockergoogle-compute-engineshutdown

How to automatically shutdown a GCE VM after the docker container finishes?


I have a batch process (packaged in a docker image) that needs to run once a day somewhere in the cloud. Google Compute Engine (GCE) seems like a simple and easy to use option for this with it's container-optimized OS VM. This works really well, except that I cannot find an easy way to automatically shutdown the VM after the docker container finishes. You can specify a startup script but GCE seems to execute it before the container is started, so doing docker wait there does not work. I don't care that it's a docker-optimized VM. One of the other basic Linux OSs (like Debian) is fine as long as it can easily be setup with docker.

Is there an easy way of automatically shutting a Linux VM down after the docker container finishes?


Solution

  • I was able to avoid shutting down the VM from within the docker container by simply deploying a regular Debian VM on Compute Engine. Steps:

    First, create a Debian VM on Compute Engine and pass a startup script that installs docker. Startup script:

    #!/bin/bash
    # Install docker. Taken from the docker documentation.
    # Passed into the gcloud command that creates the VM instance.
    apt-get -y remove docker docker-engine docker.io containerd runc
    apt-get update
    curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
    apt-get update
    apt-get -y install docker-ce docker-ce-cli containerd.io
    echo Done installing docker.
    

    Second, replace that startup script with one that pulls and runs the docker image:

    #!/bin/bash
    ...
    # Get authorization to pull from artifact registry
    gcloud -q auth configure-docker us-east1-docker.pkg.dev
    # Pull the image and run it, then shutdown.
    docker pull $image
    docker rm $container
    docker run -v $vol_ini:$app_ini -v $vol_log:$app_log --name $container $image
    shutdown now
    

    Now this VM can be scheduled to run the docker image on a daily basis and automatically shut itself down.