Docker Build and Push to GCR and Deploy to Google Cloud Run using separate projects

View Code Deploy

An example of building a custom Docker image and pushing it into a Google Cloud Container Registry and then in a separate project deploying that image with the Google Cloud Run service using TypeScript.

Note this is an adaptation of the gcp-ts-cloudrun example

Prerequisites

  1. Ensure you have the latest Node.js and NPM
  2. Install the Pulumi CLI
  3. Configure Pulumi to access your GCP account
  4. Install Docker
  5. Enable Docker to deploy to Google Container Registry with gcloud auth configure-docker
  6. Setup Docker auth with a JSON key to get image from GCR

Build and Push Docker Image

  1. Navigate to the docker-build-push-gcr directory

  2. Restore NPM dependencies:

    $ npm install
    
  3. Create a new stack:

    $ pulumi stack init dev
    
  4. Configure your GCP project and region:

    $ pulumi config set gcp:project <projectname> 
    $ pulumi config set gcp:region <region>
    
  5. Run pulumi up to preview and deploy changes:

    ``` $ pulumi up Previewing update (dev): …

    Updating (dev): Type Name Status

    • pulumi:pulumi:Stack gcr-build-image-dev created
    • └─ docker:image:Image ruby-app created

    Outputs: digest: “gcr.io/velvety-rock-274215/ruby-app:latest-fee86d3d35fccf2ad4d86bbfcdd489acf7b1e4db0ebb8166378bd1fb0ca9cee6”

    Resources: + 2 created

    Duration: 16s ```

Deploy Cloud Run

  1. Navigate to the cloud-run-deploy directory

  2. Restore NPM dependencies:

    $ npm install
    
  3. Create a new stack:

    $ pulumi stack init dev
    
  4. Configure your GCP project, region and docker config file:

    $ pulumi config set gcp:project <projectname> 
    $ pulumi config set gcp:region <region>
    $ pulumi config set docker-config-file <location of ~/.docker/config.json>
    
  5. Run pulumi up to preview and deploy changes:

    ``` $ pulumi up Previewing update (dev): Type Name Plan

    • pulumi:pulumi:Stack cloud-run-deploy-dev create
    • ├─ pulumi:providers:docker gcr create
    • ├─ docker:index:RemoteImage ruby-app-docker-image create
    • ├─ gcp:cloudrun:Service ruby create
    • └─ gcp:cloudrun:IamMember ruby-everyone create

    Resources: + 5 to create

    Do you want to perform this update? yes Updating (dev): Type Name Status
    + pulumi:pulumi:Stack cloud-run-deploy-dev created
    + ├─ pulumi:providers:docker gcr created
    + ├─ docker:index:RemoteImage ruby-app-docker-image created
    + ├─ gcp:cloudrun:Service ruby created
    + └─ gcp:cloudrun:IamMember ruby-everyone created

    Outputs: rubyUrl: “https://ruby-app-7a54c5f5e006d5cf33c2-zgms4nzdba-uc.a.run.app"

    Resources: + 5 created

    Duration: 23s ```

  6. Check the deployed Cloud Run endpoint:

    $ curl "$(pulumi stack output rubyUrl)"
    Hello Pulumi!
    
  7. Clean up your GCP and Pulumi resources (run in both projects):

    $ pulumi destroy
    ...
    $ pulumi stack rm dev
    ...