Overview
Update to Pyhon3 にて Goole Cloud SDKを同梱した Docker Image 本体にて Python2 のサポートが切られたために、Python2 系でのみ動作する App Engine を起動するコマンドの dev_appserver.py
が動作せず、本家の Google Cloud SDK - Dockerfile を使用して aetest を走らせてる場合(CI上などで)は、App Engine のインスタンスの起動に失敗して CI が落ちる、という挙動を確認しました。
対応方法
- 上記の変更が入る前の dockerfile image を使って自前でビルドしたイメージを使う。
- dev_appserver.py を起動するときに
CLOUDSDK_PYTHON=pyhon2.7
を指定する。
調査方法
調査した方法をログでまとめました。
エラーを観測する
Traceback (most recent call last): File "/usr/lib/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 95, in <module> assert sys.version_info[0] == 2 ... unable to find admin server URL
どうやら dev_appserver.py の実行に失敗し、App Engine のインスタンスが起動せず、App Engine の内部で実行するべきテストが落ちている。
なぜ起動に失敗するようになったのか調べる
本家の golang/appengine を見に行くが、何かめぼしい変更が入った様子はない。
そもそも dev_appserver.py の実行に失敗してるので dev_appserver.py を確認する。
sys.version_info[0] == 2
を見る限りどうやら python2 系が docker コンテナの中で使われなくなった模様?という仮説を立てる。
本当か?と思って本家の Docker Image で動作検証する
$ docker pull gcr.io/google.com/cloudsdktool/cloud-sdk:latest # 古いバージョンを入れるには以下 $ docker run gcr.io/google.com/cloudsdktool/cloud-sdk:260.0.0 # docker のコンテナ内に入る $ docker run --rm -it -v $PWD gcr.io/google.com/cloudsdktool/cloud-sdk:latest $ python --version Python 2.7.16 # 2.7 じゃん... $ which python2.7 /usr/bin/python2.7 # 2.7 も入ってるじゃん.... $ which dev_appserver.py /usr/bin/dev_appserver.py $ python /usr/bin/dev_appserver.py Traceback (most recent call last): File "/usr/lib/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 95, in <module> assert sys.version_info[0] == 2 # python 2系で dev_appserver.py が起動できなくなっている。 # エラーが発生している箇所でバージョンを出力してみる $ vi /usr/lib/google-cloud-sdk/platform/google_appengine/dev_appserver.py # sys.version_info[0] を print(sys.version_info[0]) に書き換える $ dev_appserver.py 3 # 3 ?! 3?!....さん?????
どうやらコンテナ内部には python2 入っているが、dev_appserver.py
を起動するときには python3 系が使われるようである。(なぜ....?)
Overview で記載した差分 (https://github.com/GoogleCloudPlatform/cloud-sdk-docker/pull/188/files) において CLOUDSDK_PYTHON=python3
という環境変数が指定されている。
そのため、 dev_appserver.py
では書かれていないが、コマンド実行時には環境変数で指定された python のバージョンを使うのでは?という仮説を立て、環境変数を指定してみて上記の書き換えた dev_appserver.py
を再度実行する。
$ CLOUDSDK_PYTHON=python2.7 dev_appserver.py 2 # なるほど....
うまくいった。
つまり、公式の Docker Image を使って aetest を起動するときには CLOUDSDK_PYTHON=python2.7
を指定するか、Docker のコンテナで環境変数を指定する、もしくは独自イメージを作成するなどして python2
系をコンテナ内で参照するようにする必要がある、ということがわかった。
refs
GCPUG での議論はこの辺
alias で指定して無理やり pyhon2 系を使う方法もあるっぽいけど、個人的には好きではない...