Dockerfile로만 $ docker run을 통해 단독으로 컨테이너를 실행하면 정상적으로 작동하지만, $ docker-compose up을 통해 모든 컨테이너를 실행시키면, 위와 같이 nodejs의 컨테이너에서 package.json을 찾지 못한다는 에러가 발생하였다.
에러가 발생하는 해당 Dockerfile을 살펴보면 아래와 같다.
FROM node:17 // node 17 버전을 불러옵니다.
WORKDIR /app // 작업 경로를 /app으로 지정합니다.
COPY package.json ./ // package.json을 /app 내부로 복사합니다.
RUN npm install // npm install을 통해 node_modules를 설치합니다.
COPY . . // 프로젝트 디렉토리를 현재 작업 경로로 복사합니다.
EXPOSE 8000 // 8000번 포트를 해당 컨테이너에서 오픈합니다.
CMD ["npm", "start"] // npm start를 실행합니다.
원인
Docker 이미지 자체로만 사용할 때는 괜찮았지만, docker-compose 사용시 첫 번째 COPY 단계에서 정상적으로 package.json를 상대경로로 읽어오면서 해당 경로를 지정해주지않아서 발생되는 문제였다.
해결방법
DockerFile을 아래와 같이 수정하고, Docker-compsoe.yml에도 volumes 옵션에 node_moudles를 지정해줌으로써 해결하였다.
FROM node:17 // node 17 버전을 불러옵니다.
RUN mkdir -p /app/src // 컨테이너 내부 디렉토리에 /app/src 디렉토리를 생성합니다.
WORKDIR /app // 현재 디렉토리를 /app으로 지정합니다.
COPY ./bot ./ // 프로젝트 디렉토리를 /app 안으로 복사합니다.
RUN npm install // npm install을 통해 node_modules를 설치합니다.
EXPOSE 8000 // 8000번 포트를 해당 컨테이너에서 오픈합니다.
CMD ["npm", "start"] // npm start를 실행합니다.
변경된 사항에 대해 간략히 설명해보자면 기존의 Dockerfile에서는 WORKDIR를 바로 지정하여 복사하는 방식이었다면, 변경된 DockerFile의 경우, RUN mkdir를 통해 확실히 디렉토리를 생성한 후, 프로젝트 디렉토리를 WORKDIR로 복사하는 방식으로 변경하였다.
참고로 docker-compose를 사용할 때, 변경된 사항을 확실히 체크하고 싶은 경우, docker-compose down --v 를 통해 컨테이너들을 done시킨 다음에 docker-compsoe up --build 옵션을 사용하여 새롭게 이미지를 빌드하는 것이 dockerFile 혹은 docker-compose.yml의 변경사항 적용이 안되는 경우를 방지하는데 좋다.
Docker-compose 사용시 package.json undefined 에러 발생 시
Dockerfile로만 $ docker run을 통해 단독으로 컨테이너를 실행하면 정상적으로 작동하지만, $ docker-compose up을 통해 모든 컨테이너를 실행시키면, 위와 같이 nodejs의 컨테이너에서 package.json을 찾지 못한다는 에러가 발생하였다.
에러가 발생하는 해당 Dockerfile을 살펴보면 아래와 같다.
원인
Docker 이미지 자체로만 사용할 때는 괜찮았지만, docker-compose 사용시 첫 번째 COPY 단계에서 정상적으로 package.json를 상대경로로 읽어오면서 해당 경로를 지정해주지않아서 발생되는 문제였다.
해결방법
DockerFile을 아래와 같이 수정하고, Docker-compsoe.yml에도 volumes 옵션에 node_moudles를 지정해줌으로써 해결하였다.
변경된 사항에 대해 간략히 설명해보자면 기존의 Dockerfile에서는 WORKDIR를 바로 지정하여 복사하는 방식이었다면, 변경된 DockerFile의 경우, RUN mkdir를 통해 확실히 디렉토리를 생성한 후, 프로젝트 디렉토리를 WORKDIR로 복사하는 방식으로 변경하였다.
참고로 docker-compose를 사용할 때, 변경된 사항을 확실히 체크하고 싶은 경우, docker-compose down --v 를 통해 컨테이너들을 done시킨 다음에 docker-compsoe up --build 옵션을 사용하여 새롭게 이미지를 빌드하는 것이 dockerFile 혹은 docker-compose.yml의 변경사항 적용이 안되는 경우를 방지하는데 좋다.
'개발 > Docker' 카테고리의 다른 글