[docker-composie] DB continer(서비스)에migration
필요조건
docker-compose
를 통해 DB container를 시작할 때migration운영 환경
Tools
Database
Migration tool
MySQL
golang migrate
결론
file system
다음 디렉토리 구성을 전제로 합니다.
본 원고는
migration
를 주제seed
로 하고 본질이 아니기 때문에 생략합니다.또한
migration
의 내용(DDL) 자체도 가능하며 sql 파일의 내용도 생략할 수 있습니다..
├── db
│ ├── conf.d
│ │ └── my.cnf
│ ├── migrations
│ │ │── Dockerfile
│ │ │── entrypoint.sh
│ │ └── migrations
│ │ └── 0001_init.up.sql
│ │ └── 0001_init.down.sql
│ │ └── 0002_xxxx.up.sql
│ │ └── 0002_xxxx.down.sql
│ └── seeds
│ │── xxxx.sql
│ │── ...
└── docker-compose.yml
docker-compose
docker-compose.yml
version: "3"
services:
db:
image: mysql:5.6
platform: linux/amd64
environment:
MYSQL_DATABASE: test
MYSQL_USER: test
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- db_volume:/var/lib/mysql:cached
- ./db/conf.d:/etc/mysql/conf.d
migrate:
build: ./db/migrations
depends_on:
- db
command: ["up"]
environment:
WAIT_HOSTS: db:3306
MIGRATIONS_DIR: /migrations
MYSQL_HOST: db
MYSQL_PORT: 3306
MYSQL_DATABASE: test
MYSQL_USER: test
MYSQL_PASSWORD: password
volumes:
- ./db/migrations/migrations:/migrations
volumes:
db_volume:
driver: local
migrate Dockerfile
migrate/Dockerfile
FROM migrate/migrate
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait
COPY entrypoint.sh /usr/local/bin
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT [ "entrypoint.sh" ]
migrate entrypoint.sh
migrate/entrypoint.sh
#!/bin/sh
/wait
/migrate \
-path $MIGRATIONS_DIR \
-database "mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(${MYSQL_HOST}:${MYSQL_PORT})/${MYSQL_DATABASE}" \
$@
Point 1:db 대기 서비스
docker-compose up
에서 모든 서비스를 시작할 때migrationcontainer는 db
(mysqld) 시작이 끝난 후에 tcp 연결을 할 수 있을 때까지 기다려야 합니다.docker-compose 서비스 간의 의존성은 dependes_on에서 선언적으로 정의할 수 있지만, 의존자인container가 Ready가 되기 전에 의존원container의 시작을 기다리는 것이 아니라 container의 시작 순서를 제어하는 것입니다.
따라서 docker-compose-wait를 이용하여 특정한 서비스가ready상태로 변하기 전에 대기한다.
migrate/Dockerfile
~
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait
~
Point2: Docker entrypoint
Googling migrateofficial docker image에서 정의
ENTRYPOINT
했기 때문에 위docker-compose-wait
를 이용하기 위해서는 위에 ENTRYPOINT
라고 써야 한다.ENTRYPOINT /wait && migrate
그러나 상술한 바와 같이 주행 과정은 /bin/sh
가 되어 CMD
를 migrate
의 매개 변수로 교부할 수 없다.docker inspect 89ab8ebc951e (container id/name)
[
{
"Id": "89ab8ebc951e3ee27a655960762227895d528173dcd7ba3dafc65c391ce5abee",
"Created": "2021-12-29T09:57:56.691705503Z",
"Path": "/bin/sh",
"Args": [
"-c",
"/wait \u0026\u0026 migrate",
"up"
],
...
따라서 ENTRYPOINT
는 셸 스크립트 파일로, CMD
는 그 매개 변수로 실행된다.COPY entrypoint.sh /usr/local/bin
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT [ "entrypoint.sh" ]
migrate/entrypoint.sh#!/bin/sh
/wait
/migrate \
-path $MIGRATIONS_DIR \
-database "mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(${MYSQL_HOST}:${MYSQL_PORT})/${MYSQL_DATABASE}" \
$@
결과↓docker inspect 127b9306a3da
[
{
"Id": "58b4b845757725c2623dc8df99d04f41c8e3aff9626f0ee26f1ac74bc7be77f8",
"Created": "2021-12-29T10:16:34.032928673Z",
"Path": "entrypoint.sh",
"Args": [
"up"
],
...
이렇게 하면 docker-compose run
의 매개 변수로migration을 할 수 있다.How to use
DB 서비스 시작 시 migration 까지 실행
docker-compose up
부팅 중인 DB 서비스 추가migration
e.g.
docker-compose run migrate down 1
migration 없이 DB만 시작하려면
docker-compose up db
Reference
이 문제에 관하여([docker-composie] DB continer(서비스)에migration), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/swallowtail62/articles/e587a6e7ff3296텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)