일찍이 살펴봤듯 결국 DockerFile은 아래의 프로세스를 따른다. (Node앱 기준)
- 도커파일 작성
- 도커 이미지 생성
- 도커 컨테이너 실행
- 도커 컨테이너 내부에서 노드앱 실행
기본적인 DockerFile 예시는 아래와 같다:
FROM node:10
RUN npm install
CMD ["node", "server.js"]
베이스 이미지(FROM)를 node로 한 이유는 npm을 지니고 있기 때문이다.
가벼워서 자주 예시로 사용되는 alpine의 경우, npm을 지니고 있지 않기 때문에 에러가 뜨게 될 것이다.
하지만 위의 예시를 활용해 빌드를 한들, 에러가 뜨게 된다.
이는 package.json을 찾을 수 없다는 식의 에러이다.
Node 베이스 이미지(와 파일 스냅샷들)를 활용하여 임시 컨테이너를 생성하게 되는 것인데,
이 임시 컨테이너 안에는 package.json이 없다보니 발생하는 에러이다.
npm install → package.json 보고 종속성 설치 → 하지만 컨테이너 안에 package.json이 없음
package.json을 넣어주기 위해 COPY 명령어를 활용한다.
package.json을 이미지의 ./ 위치에 복사하기
COPY package.json ./
FROM node:10
COPY package.json ./
RUN npm install
CMD ["node", "server.js"]
이러한 작업 후, 다시금 run 하여도 동일한 이슈가 발생한다.
이는 server.js가 부재하는, 즉 같은 맥락의 에러인 것이다.
즉, package.json뿐만 아니라 엔트리포인트(ex. server.js), 다른 파일을 모두 포함해서 컨테이너 안으로 넣기 위해 '현재 디렉토리의 모든 파일을 넣어주겠다'라는 의미의 COPY ./ ./ 를 사용한다.
package.json 내의 종속성이 바뀌게 되면 매번 빌드를 새롭게 해줘야 하는데, 빌드 시 효율성을 위해 COPY를 아래와 같이 작성하기도 한다.
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY ./ ./
RUN npm run build
CMD ["node", "server.js"]