takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

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 でコンテナを終了させる

参考サイト

zenn.dev

qiita.com

www.geeksforgeeks.org