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のマニュアルを参照。

2020年春から帝京大学通信教育課程を始めます

きっかけ

中学1年くらいから将来の夢はパソコンを使って働くことだった。

なぜそうなったかというと単純に、ゲームが好きで、ファミコンゲームに夢中だったからである。

ファミコンゲームのソフトを作る仕事をしたいと先生に問うと、「パソコンを使ってプログラムを組めるようにならないと難しいよ」という話を聞いて、プログラマーという職業に憧れを持った瞬間だった。

そのころのろう教育は、2020年時点と比較していいものではなく、一般の子と比べれば2、3年遅れているのは当たり前であった。

いろんな問題や課題があって、そうなっているのだけれど、なんとか今SIerとしてプログラミングを書いたりしている。

そして、去年の暮れに競技プログラミングを始めて、もちろん壁にぶつかった。

その壁を乗り越えるべく、ググってみると、やっぱり自分自身の基礎学力がちょっと低いなという印象をもった。

プログラムを組めるのはいいけれど、なぜそう書くべきか、論理的に説明できる可動かって言えばそうではないところもある。

それじゃなんかつまらないし、きちんとコンピュータサイエンスを学ぼうということでいろいろ調べた末、帝京大学の理工学部の情報科学科、通信教育課程に入ろうと決意した。

4/3 教材に関する資料が届く

  • 学生証
  • 学生便覧
  • 時間割
  • レポート返送用封筒
  • レポート提出票
  • レポート用紙
  • LMSハンドブック
    (ほかにもありますが、略しています)
  • 同封されているものがあるかどうかチェック。

最初にやるべきこと

  • 履修登録しないと、レポート課題等が公開されない
  • 受講する科目を決める
  • 紀伊國屋書店 教科書ストアMyKiTSの登録
    • 少し安く買える、買えない本はここで買えることもある
    • メルカリやAmazonの方が安く入手できることも
    • 図書館もありだが、今の状況じゃいけないし。。
  • 4月末までに1年間の受講科目を決めて履修登録しないと、1年間を棒に振ることになるので注意が必要。

1年をどう過ごすか

  • めちゃ大変なのは確か。
  • 単位取得
    • テキスト授業
      • テキスト、サブテキストを読んで、レポートを書く→レポート提出→科目修得試験を受ける→レポート、科目修得試験に合格→単位取得。
    • メディア授業
      • メディア授業→LMSにある課題に取り組む→課題を提出→提出したものの添削を受ける→科目修得試験を受ける→科目修得試験に合格→単位取得。
    • スクーリング授業
      • 夏、秋に大学の指定会場で開催されるスクーリング授業を受ける→最終日に科目修得試験を受ける→科目修得試験に合格→単位取得。

        過去に一回頓挫したのと、今の年齢でチャレンジするのは、いろんな意味で敷居がとても高いことだと思う。
        スタートって遅くないって自分に言い聞かせながら、頑張ろう。

フィルム写真にExif情報を埋め込む

フィルム写真

デジタルカメラがまだ復旧していなかった写真が膨大にあり、macOSのリニューアルで使えなくなったScanSnapを買い換えた当時に整理し始めた。(ほとんど嫁がやってるけれど…有難う御座います)

スキャンして、Googleフォトにあげようと思ったら、このままじゃ撮影日時が実際の日時とすごくズレている。。。

20年前の写真なのに。。。

何かいいかなーと思ったら、「exiftool」というものを発見した。

開発した Phil Harvey さんが 開発、リリースしている。

Install

1
> brew install exiftool

書き換えるためのコマンド

ググって見た情報だと、「-alldates」って書いてあるのがほとんどで試したら変わらず、オリジナルファイルが複製されただけだった。
いろいろ検証してみると、「-FileModifyFile」でいけた。

1
> exiftool -FileModifyDate='2006:05:03 08:00:00' *.jpg

Eixf 情報が書き込まれているかの確認

  • previewのインペクタ(⌘+I)で確認できる。

  • exiftool 001.jpg でもOK。

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
❯ exiftool さざえ&まこと結婚式.jpg
ExifTool Version Number : 11.85
File Name : さざえ&まこと結婚式.jpg
Directory : .
File Size : 260 kB
File Modification Date/Time : 2006:05:03 08:00:00+09:00
File Access Date/Time : 2020:04:03 23:24:26+09:00
File Inode Change Date/Time : 2020:04:03 23:24:26+09:00
File Permissions : rw-r--r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Exif Byte Order : Big-endian (Motorola, MM)
Orientation : Horizontal (normal)
X Resolution : 600
Y Resolution : 600
Resolution Unit : inches
Modify Date : 2006:05:03 08:00:00
Date/Time Original : 2006:05:03 08:00:00
Create Date : 2006:05:03 08:00:00
Color Space : sRGB
Exif Image Width : 2748
Exif Image Height : 2081
Current IPTC Digest : d41d8cd98f00b204e9800998ecf8427e
IPTC Digest : d41d8cd98f00b204e9800998ecf8427e
Image Width : 2748
Image Height : 2081
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 2748x2081
Megapixels : 5.7

寄付しようと思ったら

素晴らしいツールだし、今後も開発を続けてほしいという気持ちを込めて、PayPal経由で寄付しようと思ったら、日本からだと受け付けてないみたい…。残念。

参考にしたURL(ありがとうございます)

おすすめアイテム

富士通 PFU ドキュメントスキャナー ScanSnap iX1500 (両面読取/ADF/4.3インチタッチパネル/Wi-Fi対応)