Dockerfile を GCP の Cloud Run にデプロイする

はじめに

Dockerfile を作って Google Cloud Run にデプロイする手順のメモ。
今まで、Docker を使ってコンテナを作っておけば、基本どの環境でもアプリを立ち上げられる。
Mac で作ったアプリを、 Windows または Ubuntu 上で動かすにしても、必要なプログラミング言語やデータベース、ライブラリ等の導入が先に必要で、そこで行き詰まったりする。
OS が異なると、アプリを動かすために必要なソフトウェア類の導入も一筋縄でいかないケースが多い。
それが Dockerfile にアプリを動かす前提条件を書いておけば、その通りに事前に導入してくれるので楽。
ここの例は Python のフレームワークである、 Flask を例にして最終的に Cloud Run にデプロイするまでの流れをまとめたい。

Flask アプリと Dockerfile を書く

Flask(app.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
return "Hello, Flask!"

@app.route('/docker')
def hello2():
return "Hello, Docker!"

if __name__ == '__main__':
app.run()

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
##PythonのDockerイメージを指定
FROM python

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . .

#ライブラリインストール
RUN pip install flask

#コマンド実行
CMD python app.py

ローカル Docker でビルドしてみる

1
> docker build -t hello_flask .

最後の「.」を忘れずに(これはDockerfileパスの指定)

出力結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sending build context to Docker daemon  3.584kB
Step 1/6 : FROM python
---> f88b2f81f83a
Step 2/6 : ENV APP_HOME /app
---> Using cache
---> e653346a0ee5
Step 3/6 : WORKDIR $APP_HOME
---> Using cache
---> 4bd2068dd7c1
Step 4/6 : COPY . .
---> 7904c315ded5
Step 5/6 : RUN pip install flask
---> Running in 4430fd9333bf
Collecting flask
Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.1-py2.py3-none-any.whl (126 kB)
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting click>=5.1
Downloading click-7.1.1-py2.py3-none-any.whl (82 kB)
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl (32 kB)
Installing collected packages: itsdangerous, MarkupSafe, Jinja2, Werkzeug, click, flask
Successfully installed Jinja2-2.11.1 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.1 flask-1.1.2 itsdangerous-1.1.0
Removing intermediate container 4430fd9333bf
---> 50b8d018f549
Step 6/6 : CMD python app.py
---> Running in b05753ebc70f
Removing intermediate container b05753ebc70f
---> 3399d6d70f76
Successfully built 3399d6d70f76
Successfully tagged hello_flask:latest

作成したイメージをもとにコンテナを立ち上げ

1
2
3
4
5
6
7
8
9
10
11
12
docker run -it -p 5000:5000 hello_flask
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 138-899-674
172.17.0.1 - - [13/Apr/2020 14:04:43] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [13/Apr/2020 14:04:51] "GET /docker HTTP/1.1" 200 -

こんな感じで立ち上げ、http://0.0.0.0:5000/ にアクセスすると、「Hello, Flask!」と表示できるのを確認できます。
ローカルPCのDockerで動作確認ができたら、GCPのContainer Registryにイメージをアップしてみます。

Container Registry へ Docker コンテナをビルド

1
gcloud builds submit --tag gcr.io/[PROJECT_ID]/[IMAGE_NAME]

Cloud Run へデプロイ

1
gcloud beta run deploy --image gcr.io/[PROJECT_ID]/[IMAGE_NAME]

下記のように、引数指定で入れておくと、対話せずそのままデプロイまでいけます。

1
gcloud beta run deploy appname --image gcr.io/[PROJECT_ID]/[appname] --platform=managed --region=asia-northeast1

詳細はGCPのマニュアルを参照。