왜냐면 이미지에 필요한 임시 컨테이너 내부엔 package.json이 없기 때문
node 베이스 이미지를 통해 임시 컨테이너를 생성하면서 node 베이스 이미지의 파일 스냅샷(home, bin 등)을 임시 컨테이너의 하드 디스크에 넣는다.
이때 애초에 node 베이스 이미지에 package.json이 없으니 임시 컨테이너 내부에도 없는 것!
그러한 이유로 COPY를 통해 package.json을 컨테이너로 넣어줘야 한다
1. 포트 맵핑
하지만 생성 이미지로 어플리케이션 실행 시 실행 포트로 접근이 안된다.
그 이유는 로컬 네트워크도 컨테이너 내부 네트워크에 연결시켜줘야 하기 때문이다
도커 실행 시 -p
옵션으로 포트를 맵핑시켜야 한다
-p 5000 :8080
WORKDIR
설정dockerFile에서 WORKDIR
을 설정하지 않고 COPY
를 하게 되면 같은 파일 이름이 있을 경우 파일이 덮어쓰기가 될 수 있다.
모든 파일이 한 디렉토리에 들어가서 가독성이 떨어진다.
그래서 모든 어플리케이션을 위한 소스를 WORKDIR
를 통해 띠로 보관한다.
root가 아닌 특정 디렉토리 (usr/src/app 등)으로 설정함
** 쉘로 접근하기 docker run -it <이미지 이름> sh
COPY package.json ./
RUN npm install
COPY ./ ./
COPY의 대안으로 사용할 수 있다.
도커 컨테이너가 로컬을 참조하는 구조
docker run -p 5000:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app <이미지 이름>
-v /usr/src/app/node_modules
-> node module은 컨테이너 맵핑하지 않는다
-v ${pwd}:/usr/src/app
-> pwd 경로에 있는 디렉토리를 참조한다.