MySQL Sample Docker
Jason은 MySQL 데이터베이스로 어떤 테스트하고 싶을 때 MySQL 에서 공식 샘플 데이터베이스(sakila, world …)를 쓰고 있었다.
Jason은 편의를 위해 Docker 실행 한번으로 이 샘플을 바로 사용할 수 있으면 좋겠다는 생각으로 작업을 시작했다.
https://hub.docker.com/r/enzinier/mysql-sample
공식으로 제공되는 MySQL Docker Image 위에 mysql 서버가 연결가능할 때 샘플 데이터베이스를 초기화하는 방식으로 구현했다.
물론 쉽게 할 수 있는 방법으로 미리 샘플 데이터를 설치한 후 그대로 Docker Image를 만드는 방식이 있다. 문제는 샘플 크기에 따라 업로드해야 되는 단일 파일 크기가 증가하고 다른 샘플 데이터를 동적으로 추가하기 어렵다는 것이다.
Get Jason Park’s stories in your inbox
Join Medium for free to get updates from this writer.
MySQL 서버가 시작하는 시점에 데이터 초기화를 같이 하는 방법을 못찾아 시작 시점에 계속 Health Check하여 연결이 성공할 때 데이터베이스를 SQL로부터 초기화하는 쉘 스크립트를 구현했다.
Dockerfile 에서 이 코드를 Background Job 으로 실행할 수 있도록 기존 docker-entrypoint.sh 의 2번째 줄에 삽입했다.
RUN sed -i '2ibash /tmp/initialize_db.sh &> /tmp/initialize.log &' /usr/local/bin/docker-entrypoint.sh이 구문의 특정 라인 삽입 커맨드 때문에 시간을 좀 보냈다. 가장 간단한 구문으로 특정 라인에 원하는 문구를 삽입하기 위해 sed 를 선택했는데 이는 gnu sed 로서 macOS 에 빌트인 된 sed 가 지원하지 않는 -i (in place) 옵션을 제공한다.
그래서 macOS 에서 source 를 직접 docker build 를 한다면 다음과 같이 gnu sed 를 설치해야 된다.
brew install gnu-sed --default-names다음과 같이 Docker 를 실행하면 초기화된 샘플 데이터베이스들을 볼 수 있다.
docker run --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=local --name mysql-local enzinier/mysql-sample:latest만약 공식 샘플 말고 개인적인 데이터베이스를 초기화하고 싶다면 다음과 같이 mount 옵션을 추가하면 된다.
-v $(pwd)/test:/tmp/initialize_sqlJason 은 이 샘플 데이터베이스를 percona toolkit 을 테스트할 때 자주 사용했고 이에 대한 정리를 하다 계속 초기화하기 귀찮아서 Docker Image 로 만들게 되었다.
다음에는 이 샘플 데이터를 이용해서 pt-online-schema-change 사용법을 올릴 계획이다.








