Dockerfile만 사용하기
바인드 마운팅을 이용해 로컬에 node 설치 없이 도커만 사용하여 간편하게 node를 사용할 수 있다.
# Dockerfile
FROM node:14-alpine
WORKDIR /app
# CMD [ "npm", "start" ]
# ENTRYPOINT [ "npm" ]
Dockerfile에 사용할 노드 버전과 work directory(WORKDIR)
를 지정해주고 이미지를 빌드한다.
# image build
docker build -t node-util .
# 바인드 마운팅
docker run -it -v 'C:\study\utility:/app' node-util npm init
현재 디렉토리를 노드 컨테이너와 바인드 마운팅하여 로컬에 npm init
(npm 의존성 설치)을 진행한다.
이 때 image(node-util)뒤에 추가된 npm init
명령은 Dockerfile에 있는 CMD
명령어를 덮어씌우기 때문에 npm start
명령은 실행되지 않고 npm init만 실행된다.
ENTRYPOINT 명령어의 경우, ENTRYPOINT를 먼저 실행시키고 image 뒤에 추가된 명령을 실행한다. 따라서 docker run 명령은 아래와 같이 변경시켜야 한다.
docker run -it -v 'C:\study\utility:/app' node-util init
ENTRYPOINT의 npm 명령과 합쳐져 npm init 명령이 실행된다.
두 명령 모두 컨테이너 실행 후 자동으로 package.json이 설치되는 것을 확인할 수 있다.
docker-compose 파일 사용하기
현재 dockerfile
FROM node:14-alpine
WORKDIR /app
ENTRYPOINT [ "npm" ]
docker-compose.yaml 파일을 작성한다.
version: "3.8"
services:
npm:
build: ./
stdin_open: true
tty: true
volumes:
- ./:/app
docker-compose up
명령을 사용하면 docker run 명령때처럼 npm init 명령을 함께 줄 수 없다.
대신 docker-compose run
명령을 사용하여 init 명령을 줄 수 있다.
docker-compose run --rm npm init
--rm
옵션을 이용해 컨테이너 종료시 자동으로 삭제시킨다.
services label
을 npm으로 사용하였으므로 npm을 붙여 npm service를 실행시킨다.
npm 서비스의 dockerfile에서 ENTRYPOINT
와 명령줄에서 init
이 합쳐져 npm init 명령이 실행된다.
compose를 사용할 때에도 자동으로 package.json이 생기는 것을 확인할 수 있다.