Python から MySQL に接続するサンプルプログラムを Docker で動かす
Python の mysqlclient を使ったサンプルプログラムを Docker で動かしたときの手順メモ
検証環境
Windows10 Home Edition (version 21H2) VirtualBox 6.1.32 vagrant 2.2.19 # Docker Host OS ubuntu 20.04.3 LTS (Focal Fossa) Docker version 20.10.8, build 3967b7d docker-compose version 1.29.2, build 5becea4c
ファイル構成
test │ Dockerfile │ docker-compose.yml │ example.py
Dockerfile
FROM python:3.9.10-slim-buster RUN apt-get update && \ apt-get -y install gcc libmariadb-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN /usr/local/bin/python -m pip install --upgrade pip RUN pip install mysqlclient COPY ./example.py /app/example.py WORKDIR /app CMD python ./example.py
docker-compose.yml
version: "3.4" services: app: build: context: . dockerfile: ./Dockerfile image: "takaya030/pymysql" container_name: pymysqlclient db: image: mysql:5.7.37 container_name: mysql_host environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: test_database MYSQL_USER: docker MYSQL_PASSWORD: docker TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 3306:3306
example.py
import MySQLdb import time # MySQLの起動を待つため time.sleep(5) connection = MySQLdb.connect( host='db', user='docker', passwd='docker', db='test_database') cursor = connection.cursor() cursor.execute("""SHOW CREATE DATABASE test_database; """) myresult = cursor.fetchall() for row in myresult: print(row) connection.close()
イメージのビルド
$ cd test $ docker-compose build app
動作確認
Docker コンテナの起動
$ cd test $ docker-compose up
正常動作していれば 5 秒後に下記のログが出力される
pymysqlclient | ('test_database', 'CREATE DATABASE `test_database` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */')
Ctrl + C
でコンテナを終了させる