オライリーの「Docker」のサンプルが動かなかったので修正してみる
約2年前の2016年8月に発行されたオライリー「Docker」。5章「開発でのDockerの利用」を実際に手を動かして確認してみたところ、所々動かない個所があったので修正してみる。
1.「5.1 “Hello World!”」
コンテナ内で実行してみたがエラーになる・・・どうやら2行目がインデントされているのが問題のようだ。
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!\n' if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
下記 Dockerfile は問題なし。
FROM python:3.4 RUN pip install Flask==0.10.1 WORKDIR /app COPY app /app CMD ["python", "identidock.py"]
コンテナのビルド&起動も問題なし。
$ docker build -t identidock . $ docker run -d -p 5000:5000 identidock
curlコマンドによる動作確認は・・・Windows環境なのでcurlがないのと、コンテナ内へホスト環境からアクセスするには上記Pythonコードの「host=0.0.0.0」をコンテナに割り当てられたIPアドレスに書き換える必要(?)があるようなので・・・せっかくなのでcurlがインストールされたDockerイメージを使って動作確認してみる。
$ docker run --rm -it --entrypoint /bin/sh byrnedo/alpine-curl / # curl http://172.17.0.3:5000/ Hello World!
IPアドレス「172.17.0.3」は、identidockイメージから起動されたコンテナのアドレス。本来ならば –link 等を使ってもっとエレガントにやるのだろうが・・・。続いて、アプリケーションサーバ uWSGI を使うためのDockerfile。
FROM python:3.4 RUN pip install Flask==0.10.1 uWSGI==2.0.8 WORKDIR /app COPY app /app CMD ["uwsgi", "--http", "0.0.0.0:9090", "--wsgi-file", "/app/identidock.py", \ "--callable", "app", "--stats", "0.0.0.0:9191"]
uWSGIのコンパイル(?)エラーが出力されて、イメージのビルドに失敗する。。Pythonのバージョンを変えたり、FlaskやuWSGIのバージョン指定を外したりしても改善しなかったので、結局UbuntuをベースにPython3.6をインストールするやり方にしてみた。
FROM ubuntu:18.04 RUN apt-get update -y && apt-get install -yq python3-pip python3-dev wget && \ wget https://bootstrap.pypa.io/get-pip.py && python3.6 get-pip.py && \ pip install Flask uWSGI WORKDIR /app COPY app /app CMD ["uwsgi", "--http", "0.0.0.0:9090", "--wsgi-file", "/app/identidock.py", "--callable", "app"]
CMD行も”–stats”あたりでエラーが出てコンテナが起動できなかったので、パラメタを削除して起動するようにした。