Docker파일 안에서 prisma migrate를 하기 위해 npm run migrate:dev를 RUN 키워드와 함께 실행 시켰지만,
Error: P1001 에러와 함께 db컨테이너에 접속 할 수 없다는 메시지를 보게 되었습니다.
잊지 않기 위해 어떻게 해결 하였는지 정리해봅니다.
혹시 컨테이너간에 어떻게 통신해야 하는지 잘 모른다면 이전에 올린 포스트를 참고해 주시길 바랍니다.
(docker-compose로 db, 백엔드 컨테이너 연결 포스트)
Docker Prisma 연결 실패
앞선 포스트에서처럼 커스텀 브릿지 설정을 통해 백엔드 컨테이너 내부에서 db컨테이너로 연결이 잘 되었지만, docker-compose up -d 명령어를 이용하면 항상 아래와 같은 에러가 발생했습니다.
이 당시 나의 docker 파일과 데이터 베이스 연결 설정 파일은 아래와 같습니다.
## Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
COPY ./src/database/ ./src/database/
RUN npm install -g dotenv-cli
RUN npm ci
COPY ./ ./
RUN npm run migrate:dev
CMD ["npm", "run", "dev"]
##.env
DATABASE_URL="mysql://[mysql-user]:[mysql-password]@mysqldb:3306/HABITS?connect_timeout=300"
프리즈마 DATABASE_URL에 mysqldb, 즉 데이터베이스 컨테이너 이름을 넣은 것도 맞고, ping을 했을 때 mysqldb에 정상적으로 보내지는 것도 확인했으며, timeout도 설정해봤지만 달라지지 않았습니다.
Dockerfile RUN 커맨드의 함정
내가 Dockerfile을 작성할 때 간과한 점이 있었습니다.
바로 RUN 커맨드는 컨테이너가 실행될 때 트리거 되는 것이 아니라, 이미지를 만들 때 실행 된다는 점이었습니다.
즉, 이미지를 만들고 있는 와중에는 제대로 브릿지 네트워크의 DNS가 작동하지 않게 되고 따라서 계속 mysqldb:3306에 연결이 실패하게 되는 것입니다.
이 부분은 CMD에서 migrate를 하도록 설정해주면 됩니다.
CMD는 이미지 생성시점이 아닌 컨테이너 실행 시점에 작동되는 명령어이기 때문입니다.
package.json파일을 아래처럼 변경하고,
{
...
"scripts": {
"prebuild": "rimraf dist",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"start:migrate:prod": "prisma migrate deploy && npm run start:prod", // new script 👈
},
...
}
Dockerfile의 CMD를 아래처럼 만들어 주면 정상적으로 빌드되고 구동까지 되는 것을 확인 할 수 있습니다.
CMD [ "npm", "run", "start:migrate:prod" ]
'Docker' 카테고리의 다른 글
[Docker]docker-compose로 db, 백엔드 컨테이너 연결 (1) | 2023.10.10 |
---|---|
Docker로 Mysql 컨테이너 띄우고 접속 (0) | 2023.09.12 |
[Solved] docker container에서 local db 접속하기 (host.docker.internal) (1) | 2022.10.29 |
[Docker] Docker 설치하기 (특정 버전 docker 설치) (1) | 2022.10.07 |
[Docker - 3] Dockerfile 작성법 (with example) (1) | 2022.09.24 |