diff --git a/Dockerfile b/Dockerfile
index b27e98dc1d029b5c50f84827d3b069beff0b233d..31e9571dd4314d68abce98db0666afcd97bb29b7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,9 @@
-FROM golang:1.13
+FROM golang:1.15
 
 WORKDIR /go/src/github.com/mccutchen/go-httpbin
 
-COPY Makefile .
-RUN make deps
+# Manually implement the subset of `make deps` we need to build the image
+RUN cd /tmp && go get -u github.com/kevinburke/go-bindata/...
 
 COPY . .
 RUN make build buildtests
diff --git a/Makefile b/Makefile
index bac4336e2e018879bb1e766df32ac93565b11ccf..d22faeefebecd94e24c6eda652dde23cf1eca24f 100644
--- a/Makefile
+++ b/Makefile
@@ -2,15 +2,24 @@
 
 # The version that will be used in docker tags (e.g. to push a
 # go-httpbin:latest image use `make imagepush VERSION=latest)`
-VERSION        ?= $(shell git rev-parse --short HEAD)
+VERSION ?= $(shell git rev-parse --short HEAD)
 
-# Override these values to deploy to a different App Engine project
+# Override these values to deploy to a different Cloud Run project
 GCLOUD_PROJECT ?= httpbingo
 GCLOUD_ACCOUNT ?= mccutchen@gmail.com
+GCLOUD_REGION  ?= us-central1
+
+# The version tag for the Cloud Run deployment (override this to adjust
+# pre-production URLs)
+GCLOUD_TAG ?= "v-$(VERSION)"
 
 # Run gcloud in a container to avoid needing to install the SDK locally
 GCLOUD_COMMAND ?= ./bin/gcloud
 
+# We push docker images to both docker hub and gcr.io
+DOCKER_TAG_DOCKERHUB ?= mccutchen/go-httpbin:$(VERSION)
+DOCKER_TAG_GCLOUD    ?= gcr.io/$(GCLOUD_PROJECT)/go-httpbin:$(VERSION)
+
 # Built binaries will be placed here
 DIST_PATH  	  ?= dist
 
@@ -81,19 +90,41 @@ lint: $(TOOL_GOLINT) $(TOOL_STATICCHECK)
 
 
 # =============================================================================
-# deploy & run locally
+# run locally
 # =============================================================================
-deploy: build gcloud-auth
-	$(GCLOUD_COMMAND) --account=$(GCLOUD_ACCOUNT) app deploy --quiet --project=$(GCLOUD_PROJECT) --version=$(VERSION) --promote
+run: build
+	$(DIST_PATH)/go-httpbin
+
 
-stagedeploy: build gcloud-auth
-	$(GCLOUD_COMMAND) --account=$(GCLOUD_ACCOUNT) app deploy --quiet --project=$(GCLOUD_PROJECT) --version=$(VERSION) --no-promote
+# =============================================================================
+# deploy to google cloud run
+# =============================================================================
+deploy: gcloud-auth imagepush
+	$(GCLOUD_COMMAND) beta run deploy \
+		$(GCLOUD_PROJECT) \
+		--image=$(DOCKER_TAG_GCLOUD) \
+		--revision-suffix=$(VERSION) \
+		--tag=$(GCLOUD_TAG) \
+		--project=$(GCLOUD_PROJECT) \
+		--region=$(GCLOUD_REGION) \
+		--allow-unauthenticated \
+		--platform=managed
+
+stagedeploy: gcloud-auth imagepush
+	$(GCLOUD_COMMAND) beta run deploy \
+		$(GCLOUD_PROJECT) \
+		--image=$(DOCKER_TAG_GCLOUD) \
+		--revision-suffix=$(VERSION) \
+		--tag=$(GCLOUD_TAG) \
+		--project=$(GCLOUD_PROJECT) \
+		--region=$(GCLOUD_REGION) \
+		--allow-unauthenticated \
+		--platform=managed \
+		--no-traffic
 
 gcloud-auth:
 	@$(GCLOUD_COMMAND) auth list | grep '^\*' | grep -q $(GCLOUD_ACCOUNT) || $(GCLOUD_COMMAND) auth login $(GCLOUD_ACCOUNT)
-
-run: build
-	$(DIST_PATH)/go-httpbin
+	@$(GCLOUD_COMMAND) auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://gcr.io
 
 watch: $(TOOL_REFLEX)
 	reflex -s -r '\.(go|html)$$' make run
@@ -103,10 +134,11 @@ watch: $(TOOL_REFLEX)
 # docker images
 # =============================================================================
 image:
-	docker build -t mccutchen/go-httpbin:$(VERSION) .
+	docker build -t $(DOCKER_TAG_DOCKERHUB) -t $(DOCKER_TAG_GCLOUD) .
 
 imagepush: image
-	docker push mccutchen/go-httpbin:$(VERSION)
+	docker push $(DOCKER_TAG_GCLOUD)
+	docker push $(DOCKER_TAG_GCLOUD)
 
 
 # =============================================================================
diff --git a/bin/gcloud b/bin/gcloud
index 0c3b367c638c88291a946e58816a14552dfd490d..9f1ec9f500d14454c45cc7d248fea3bd65fb52f1 100755
--- a/bin/gcloud
+++ b/bin/gcloud
@@ -6,10 +6,12 @@
 # Adapted from this helpful blog post:
 # https://blog.scottlowe.org/2018/09/13/running-gcloud-cli-in-a-docker-container/
 
+GCLOUD_SDK_TAG="312.0.0"
+
 exec docker run \
-    --rm \
-    -ti \
+    --rm -it \
     --workdir /code \
     -v $PWD:/code \
     -v $HOME/.config/gcloud:/root/.config/gcloud \
-    google/cloud-sdk gcloud $*
+    google/cloud-sdk:$GCLOUD_SDK_TAG \
+    gcloud $*