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」