이때까지 다룬 컨테이너의 구조는 컨테이너 내부에 환경이 담겨져있고 그곳에 우리의 앱을 넣는 구조였습니다.
여기서 설명하게될 유틸리티 컨테이너는 앱을 담는것이 아닌 특정 환경만 포함하는 컨테이너를 뜻합니다. 만약 우리가 npm
명령어를 쓰려면 node.js
가 설치되어 있어야 합니다. 하지만 호스트에는 설치하지 않으면서 npm
을 사용하고 싶을 때 유틸리티 컨테이너를 사용할 수 있습니다.
# [Dockerfile]
FROM node:14-alpine # 경량버전:alpine
WORKDIR /app
ENTRYPOINT ["npm"]
docker run -it -v [project_address_in_host]:/app image_name npm install
Dockerfile
에서 node환경을 구축해줍니다.
명령어를 통해 프로젝트 폴더와 바인드 마운트 해주면서 npm init의 결과를 호스트의 환경과 공유합니다.
ENTRYPOINT
는 CMD
와 비슷하지만 차이가 있습니다. CMD
는 명령 순서가 docker run image_name [CMD 실행 위치]
입니다. 즉, 이미지 생성 후 일어나는 명령어입니다.
ENTRYPOINT
는 실행되는 것이 아니라 이미지 이름 뒤에 입력하는 모든 명령어의 접두사로 ENTRYPOINT가 추가됩니다.
docker run -it image_name init
으로 실행하면 ENTRYPOINT
가 'npm'이기 때문에 실제로는 npm init
이 실행됩니다.
유틸리티 컨테이너는 한 개일지라도 docker-compose로 다루는 것이 편합니다.
# [docker-compose.yaml]
version: "3.8"
services:
npm:
build: ./
stdin_open: true
tty: open
volumes:
- ./:/app
이제 이 docker-compose.yaml
을 실행할텐데 주의할 점이 있습니다.
이전 글에서 소개한 docker-compose up
은 파일에 정의된 서비스를 불러오고 실행 상태를 유지합니다. 그래서 docker-compose exec
을 통해 추가로 설정을 해주어야 합니다.
현재 상황은 유틸리티 컨테이너 하나만을 통해 호스트의 환경을 구축하고 종료할 컨테이너이므로 up
을 사용하는건 맞지 않습니다.
그래서 yaml파일 내의 컨테이너 중 하나만 실행가능한 명령어로 실행합니다. docker-compose run --rm npm init
으로 실행해줍니다.
단, docker-compose up
과 달리 컨테이너 중지 시 자동 삭제가 디폴트가 아니므로 --rm
을 추가해주어야 합니다.
이러면 npm init
으로 명령어가 시작되고, 설정해줬던 npm install
을 실행하고, 이 명령어를 통해 컨테이너 내부의 파일이 바인드된 외부 폴더로 실시간 작성이 됩니다.
이렇게 환경을 구축하도록 도와주는 컨테이너를 유틸리티 컨테이너라 합니다.