COPY : 도커 이미지 안에도 뭐가 있어야지

Robin·2024년 1월 31일
post-thumbnail

일찍이 살펴봤듯 결국 DockerFile은 아래의 프로세스를 따른다. (Node앱 기준)

  1. 도커파일 작성
  2. 도커 이미지 생성
  3. 도커 컨테이너 실행
  4. 도커 컨테이너 내부에서 노드앱 실행

기본적인 DockerFile 예시는 아래와 같다:

FROM node:10

RUN npm install

CMD ["node", "server.js"]

베이스 이미지(FROM)를 node로 한 이유는 npm을 지니고 있기 때문이다.
가벼워서 자주 예시로 사용되는 alpine의 경우, npm을 지니고 있지 않기 때문에 에러가 뜨게 될 것이다.

COPY

package.json이 없다고 나오는 이유

하지만 위의 예시를 활용해 빌드를 한들, 에러가 뜨게 된다.
이는 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"]
profile
Always testing, sometimes dog walking

0개의 댓글