docker-compose로 APP 컨테이너가 DB 컨테이너의 시작 완료를 기다려주지 않는 문제를 손쉽게 해결
개요
요 전날 Docker를 처음 만졌을 때 DB 컨테이너보다 먼저 응용 프로그램 컨테이너가 시작되는 문제가 발생했습니다.
Dockerfile에서 depends_on
를 지정하면 시작 순서를 제어 할 수 있었지만 컨테이너가 시작될 때까지 기다리지 않으므로 응용 프로그램 컨테이너에서 오류가 발생합니다.
조사해 보면, 쉘을 써서 해결하고 있는 기사가 많았는데, 보다 간편하게 해결할 수 있는 라이브러리를 발견했습니다.
사용 기술
docker-compose-wait
이 기사에서 소개하는 것은
docker-compose-wait
라는 라이브러리입니다.htps : // 기주 b. 코 m / 우후 s s t / 도 c 케 r- 코 m 포세 와이 t
우선 시험하고 싶은 분. 이번에 작성한 샘플 리포지토리입니다.
htps : // 기주 b. 코 m / 유타 세키 36 / sp 린 g-Boo t-do C-r-ma
1. 라이브러리 없이 컨테이너를 빌드해 봅니다.
우선 라이브러리 없이 컨테이너를 빌드해 보겠습니다.
다음 이미지와 같이 DB 컨테이너가 시작된 순간에 응용 프로그램 컨테이너가 시작됩니다.
응용 프로그램 컨테이너는 DB 컨테이너에 의존하기 때문에 DB 컨테이너 시작이 완료되지 않은 상태에서 응용 프로그램 컨테이너가 시작되면 다음과 같이 오류가 발생합니다.
이 상황을 해결하기 위해서는 다음과 같이 쉘을 작성하여 해결하는 경우가 많습니다.
htps : // / cs. 도 c r. 코 m / 코 m 포세 / s r p o r r /
그러나
docker-compose-wait
를 사용하면 쉘을 거의 쓰지 않고 해결할 수 있습니다.docker-compose-wait를 사용해보기
1. Dockerfile 변경
Dockerfile을 다음과 같이 만듭니다.
코멘트가 있는 부분에서 라이브러리를 추가하고 있습니다.
FROM maven:3.3.9-jdk-8-alpine AS build
COPY ./ /work
WORKDIR /work
RUN mvn clean package
FROM openjdk:8u181-jre-alpine3.8
WORKDIR /home
COPY ./run.sh /usr/local/bin/run.sh
RUN chmod +x /usr/local/bin/run.sh
# waitライブラリの追加
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.6.0/wait /wait
# ライブラリの権限変更
RUN chmod +x /wait
COPY --from=build /work/target/dtest-0.0.1-SNAPSHOT.jar /home/
CMD /wait && /usr/local/bin/run.sh
2. docker-compose 변경
Dockerfile을 변경하면 docker-compose를 수정합니다.
다음과 같이 wait하고 싶은 컨테이너의 environment에 기동을 기다리고 싶은 컨테이너의 호스트를 정의합니다.
version: '2'
services:
dbserver:
build: ./docker/mysql
image: demo-db:0.0.1
restart: always
environment:
MYSQL_DATABASE: demo_db
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: rootpassword
ports:
- "3314:3306"
volumes:
- ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
- ./docker/mysql/conf.d:/etc/mysql/conf.d
- ./log/mysql:/var/log/mysql
app:
build: ./
image: dtest/boot:0.0.1
depends_on: # 依存関係をここで指定できるが,順序を指定できるだけで起動を待ってくれたりはしない
- dbserver
ports:
- "8080:8080"
volumes:
- .:/app
environment:
# waitするホストを指定する.
# 複数のwait_hostを指定することもできます.(MySQLだけでなくRedisの起動を待ちたい時なども便利です.)
WAIT_HOSTS: dbserver:3306
volumes:
mysql-db:
driver: local
빌드
위의 파일을 수정 한 후
docker-compose up --build
를 실행해 봅시다.이전에는 DB 컨테이너가 시작된 직후 응용 프로그램 컨테이너가 시작되었지만 이제는 응용 프로그램 컨테이너가 DB 컨테이너가 시작될 때까지 기다리고 있습니다.
그리고 무사히 DB 컨테이너의 기동이 완료되고 나서 어플리케이션 컨테이너의 기동이 시작되었습니다.
방금 전에는 에러로 넘어 버렸습니다만, 이번은 에러없이 어플리케이션의 실행이 완료했습니다.
요약
이번은
docker-compose-wait
의 소개였습니다.스스로, 이 라이브러리를 쓰러뜨린 것은 아니기 때문에 기본적인 사용법만의 소개가 되어 버렸습니다.
자세한 내용은 리포지토리의 README에서 확인하십시오.
htps : // 기주 b. 코 m / 우후 s s t / 도 c 케 r- 코 m 포세 와이 t
다른 기사에서 오자 탈자와 잘못된 정보 등 기재하고 있으면 코멘트에서 지적해 주시면 감사하겠습니다!
Reference
이 문제에 관하여(docker-compose로 APP 컨테이너가 DB 컨테이너의 시작 완료를 기다려주지 않는 문제를 손쉽게 해결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yseki_/items/ed97060e8793a75c150e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)