docker-compose를 사용해 node.js 서버와 mysql db 서버 컨테이너를 만들고 node.js 서버에서 mysql db 서버에 연결을 시도하면, closed 오류가 발생한다. 이는 node.js 서버가 mysql db에 연결을 시도할 때, 아직 mysql db 서버가 완전히 실행되지 않았기 때문에 발생하는 문제이다.
이를 해결하기 위해 node.js 서버가 mysql db 서버 구동 완료 후에 실행될 수 있게 해야 한다.
이는 node.js와 mysql 외의 다른 서버와 DB에 모두 적용가능한 방법이다.
디렉토리 구조
📦
┣ 📂 db
┃ ┣ 📂 conf.d # MySQL configuraiton (선택)
┃ ┃ ┗ 📜 my.cnf
┃ ┣ 📂 initdb.d # MySQL 초기 DB 설정 (선택)
┃ ┃ ┣ 📜c reate_table.sql # 초기 테이블 생성 (선택)
┃ ┃ ┗ 📜 insert_data.sql # 초기 데이터 삽입 (선택)
┣ 📂 server
┃ ┣ 📂 node_modules
┃ ┣ 📜. dockerignore
┃ ┣ 📜 docker-entrypoint.sh
┃ ┣ 📜 Dockerfile
┃ ┣ 📜 index.js
┃ ┣ 📜 package-lock.json
┃ ┗ 📜 package.json
┗ 📜 docker-compose.yml
이 중 필수적으로 봐야할 파일들은 다음과 같다.
docker-compse.yml
server
Dockerfile
docker-entrypoint.sh
docker-compose.yml
사실 docker-compose에는 컨테이너 생성 순서와 관련해 depends_on 이 존재한다. 하지만, 기억해야할 것은 depends_on은 컨테이너의 생성 자체에만 관여하기 때문에, 컨테이너 내부에서 서버가 완전히 실행된 상태를 고려해주지는 않는다는 점이다.
Alternately, you can ensure that the local copy referenced by the Dockerfile is executable, and then use COPY (which is explicitly documented to retain metadata).
(도커 말고) 그냥 터미널에서 ./docker-entrypoint.sh를 실행했을 때, 똑같이 권한 오류가 발생했다. 따라서, 복사하려던 원본 파일 자체의 권한을 먼저 바꿔주었다.
# ./server
chmod +x docker-entrypoint.sh
다시 docker compose up을 실행했을 때, 정상적으로 컨테이커가 실행됨을 확인했다.