K4750.NET

オライリーの「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”あたりでエラーが出てコンテナが起動できなかったので、パラメタを削除して起動するようにした。