docker-compose로 APP 컨테이너가 DB 컨테이너의 시작 완료를 기다려주지 않는 문제를 손쉽게 해결

개요



요 전날 Docker를 처음 만졌을 때 DB 컨테이너보다 먼저 응용 프로그램 컨테이너가 시작되는 문제가 발생했습니다.
Dockerfile에서 depends_on를 지정하면 시작 순서를 제어 할 수 있었지만 컨테이너가 시작될 때까지 기다리지 않으므로 응용 프로그램 컨테이너에서 오류가 발생합니다.

조사해 보면, 쉘을 써서 해결하고 있는 기사가 많았는데, 보다 간편하게 해결할 수 있는 라이브러리를 발견했습니다.

사용 기술


  • spring boot (Java)
  • MySQL
  • Docker

  • 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

    다른 기사에서 오자 탈자와 잘못된 정보 등 기재하고 있으면 코멘트에서 지적해 주시면 감사하겠습니다!

    좋은 웹페이지 즐겨찾기