dockerize를 사용하여 docker-compose 컨테이너 실행 순서 조정하기

Cherry·2023년 4월 24일
1
post-thumbnail

💬 docker compose를 사용할 때 발생할 수 있는 문제

docker compose란, 여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여 관리를 간단히 할 수 있도록 제공하는 기능입니다. 즉, docker compose를 사용하면 여러 컨테이너를 함께 연결하여 구동시킬 수 있습니다!

그러나 docker compose에서는 컨테이너가 실행되고 완료되는 순서를 완벽히 보장하지는 않기 때문에 컨테이너끼리의 연결이 필요할 경우 문제가 발생할 수 있습니다.

🙏🏻 depends_on

version: "3"

services:
  db:
    image: mysql:5.7
    container_name: mysql
    env_file: ./.env
    volumes:
      - ./database/data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: database_name
    networks:
      - server

  web:
    image: web_image_name
    container_name: web
    env_file: ./.env
    restart: always
    ports:
      - 8000:8000
    depends_on:
      - db
    networks:
      - server
networks:
  server:

depends_on은 여러 개의 컨테이너를 docker compose로 실행할 때, 실행 시점을 제어할 수 있는 속성입니다.
depends_on 을 사용하여 컨테이너 실행 순서를 제어할 수 있지만, 컨테이너의 실행 프로세스 완료 상태까지 제어하는 것은 아니기 때문에 완벽하게 우리가 원하는 대로 동작하리라는 보장은 없습니다.

💻 dockerize 모듈

저는 docker-compose로 node.js 서버와 mysql을 연결할 때 문제가 발생하였습니다!

node.js 서버보다 mysql이 늦게 구동하여 발생한 문제로 dockerize 모듈을 사용하여 해결하였습니다.

1. dockerize 모듈 설치하기

... 

ENV DOCKERIZE_VERSION v0.2.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
...

우선 Dockerfiledockerize 설치 명령어를 추가해 줍니다.

2. dockerize로 실행할 스크립트 작성하기 (docker-entrypoint.sh)

echo "wait db server"
dockerize -wait tcp://db:3306 -timeout 20s

echo "start node server"
npm start

그다음으로는 설치한 dockerize를 사용할 shell script를 작성해 줍니다. db로 사용하는 컨테이너가 모두 올라오도록 기다린 뒤 서버를 실행시키도록 스크립트를 작성해 줍니다.

3. 스크립트 파일 실행 명령어 추가하기

RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ./docker-entrypoint.sh

앞서 작성한 스크립트를 실행하도록 Dockerfile에 명령어를 추가해 줍니다.

전체 Dockerfile

FROM node:16.14.2

ENV DOCKERIZE_VERSION v0.2.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

RUN mkdir -p /app
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY . /app/

RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ./docker-entrypoint.sh

EXPOSE 8000

이렇게 Dockerfile과 스크립트를 작성해서 문제를 해결할 수 있었습니다!!

참고
https://unpasoadelante.tistory.com/197
https://github.com/jwilder/dockerize
https://jupiny.com/2016/11/13/conrtrol-container-startup-order-in-compose/

profile
호기심 많은 백엔드 개발자입니다 😝

0개의 댓글