Pythonの公式イメージにApacheとFlaskを入れてwsgiで連携する。
ディレクトリ構成
|- app/
| ├ app.wsgi
| └ hello.py
├ conf/
| └ 000-default.conf
├ Dockerfile
└ docker-compose.yml
Dockerfile
FROM python:3 USER root WORKDIR /app RUN apt-get update RUN apt-get -y install locales && \ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LANGUAGE jp_JP:ja ENV LC_ALL ja_JP.UTF-8 ENV TZ JST-9 ENV TERM xterm RUN apt-get install -y vim less RUN apt-get install -y apache2 RUN apt-get install -y apache2-dev RUN pip install --upgrade pip RUN pip install --upgrade setuptools RUN pip install --upgrade Flask RUN pip install --upgrade mod_wsgi CMD ["apachectl", "-D", "FOREGROUND"]
docker-compose.yml
version: '3' services: python3: build: . container_name: flask_apache_test hostname: flask_apache_test tty: true volumes: - ./app:/app - ./conf/000-default.conf:/etc/apache2/sites-available/000-default.conf ports: - 18080:80
conf/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /app ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/acceess.log combined # Pythonのバージョンに合わせてLoadModuleを変更する必要がある。 # バージョンがわからない場合は、以下の行をコメントアウトしてコンテナを起動し、コンソールでログインしてパスを確認する。 # docker-compose exec ${container_id} bash #LoadModule wsgi_module /usr/local/lib/python3.10/site-packages/mod_wsgi/server/mod_wsgi-py310.cpython-310-x86_64-linux-gnu.so LoadModule wsgi_module /usr/local/lib/python3.11/site-packages/mod_wsgi/server/mod_wsgi-py311.cpython-311-x86_64-linux-gnu.so WSGIDaemonProcess myapp processes=1 threads=5 python-path="/usr/local/bin/python3" WSGIScriptAlias / /app/app.wsgi <Directory /app> WSGIProcessGroup myapp WSGIApplicationGroup %{GLOBAL} Require all granted </Directory> </VirtualHost>
app/app.wsgi
import sys sys.path.insert(0, '/app') from hello import app as application
app/hello.py
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True)
更新を反映するときはwsgiファイルのタイムスタンプを更新する。「touch app.wsgi」