mysql 컨테이너를 기다리는 도커 컨테이너가 Python 이미지를 기반으로하는 경우 (예 : Django 애플리케이션의 경우) 아래 코드를 사용할 수 있습니다.
장점은 다음과 같습니다.
- mysql의 IP와 포트가 준비 될 때까지 기다리는 wait-for-it.sh를 기반으로 하지 않지만 이것이 자동으로 mysql 초기화가 완료되었음을 의미하지는 않습니다.
- 컨테이너에 있어야하는 mysql 또는 mysqladmin 실행 파일을 기반으로하는 셸 스크립트가 아닙니다. 컨테이너가 Python 이미지를 기반으로하기 때문에 해당 이미지 위에 mysql을 설치해야합니다. 아래 솔루션을 사용하면 컨테이너에 이미있는 순수 파이썬 기술을 사용합니다.
암호:
import time
import pymysql
def database_not_ready_yet(error, checking_interval_seconds):
print('Database initialization has not yet finished. Retrying over {0} second(s). The encountered error was: {1}.'
.format(checking_interval_seconds,
repr(error)))
time.sleep(checking_interval_seconds)
def wait_for_database(host, port, db, user, password, checking_interval_seconds):
"""
Wait until the database is ready to handle connections.
This is necessary to ensure that the application docker container
only starts working after the MySQL database container has finished initializing.
More info: https://docs.docker.com/compose/startup-order/ and https://docs.docker.com/compose/compose-file/#depends_on .
"""
print('Waiting until the database is ready to handle connections....')
database_ready = False
while not database_ready:
db_connection = None
try:
db_connection = pymysql.connect(host=host,
port=port,
db=db,
user=user,
password=password,
charset='utf8mb4',
connect_timeout=5)
print('Database connection made.')
db_connection.ping()
print('Database ping successful.')
database_ready = True
print('The database is ready for handling incoming connections.')
except pymysql.err.OperationalError as err:
database_not_ready_yet(err, checking_interval_seconds)
except pymysql.err.MySQLError as err:
database_not_ready_yet(err, checking_interval_seconds)
except Exception as err:
database_not_ready_yet(err, checking_interval_seconds)
finally:
if db_connection is not None and db_connection.open:
db_connection.close()
용법:
- 이 코드를
wait-for-mysql-db.py
애플리케이션의 소스 코드 안에 있는 Python 파일 ( 예 :)에 추가 합니다.
- 다른 파이썬 스크립트 작성 (
startup.py
위의 코드를 먼저 실행하고 나중에 애플리케이션을 시작하는 예 합니다.
- 애플리케이션 컨테이너의 Dockerfile이 애플리케이션의 소스 코드와 함께이 두 Python 스크립트를 Docker 이미지로 압축하는지 확인합니다.
- docker-compose 파일에서 다음을 사용하여 애플리케이션 컨테이너를 구성합니다
command: ["python3", "startup.py"]
..
이 솔루션은 MySQL 데이터베이스 용으로 만들어졌습니다. 다른 데이터베이스에 대해 약간 조정해야합니다.