Medium - Quickly Improve Your Docker and Node.Js Containers
in Trend
Trend 파악을 위한 Medium 기고문 포스팅 - 빠르게 도커와 노드 컨테이너를 개선시켜봅시다.
여러분들은 모두 기본적인 도커파일로 익스프레스와 같은 응용프로그램을 만드는 방법을 아실겁니다. 도커파일의 내용은 다음과 같을 겁니다.
FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY . /app
EXPOSE 8080
CMD ["npm", "start"]
정말로 간단합니다. 그치만 여기에는 몇 가지 결함이 있습니다. 함께 결함들을 고쳐봅시다.
User
기본적으로 도커는 root 사용자 권한으로 Node.js를 실행시키기 때문에 보안 문제를 야기할 수 있습니다. 많은 경우 컨테이너를 돌릴 때는 root가 아닌 권한으로 돌릴려고 하실 겁니다. 이것을 해결하기 위해서는 도커파일안에서 다른 user를 사용하면 됩니다. 도커의 모든 Node.js 이미지들은 node 라고하는 권한으로 실행될 것입니다. 도커파일에 USER
항목을 추가해서 user를 사용할 수 있습니다.
FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY . /app
EXPOSE 8080
## define user just at the end
USER node
CMD ["npm", "start"]
만약 이미 만들어진 컨테이너의 Docker CLI를 사용하려고 하신다면 --user, -u
플래그를 사용하시면 됩니다.
docker run --user node my_image
CMD
npm start
, yarn start
명령으로 도커 컨테이너를 실행시키는 경우가 있으실 겁니다. 아마 그건 npm/yarn 으로 작업을 하면 생기는 습관인거 같습니다.
거기엔 2가지 문제점이 있습니다. 첫번째로 컨테이너에 불필요한 프로세스를 추가하는 것입니다. 두번째로 도커와 Node.js 사이에 SIGTERM
과 같은 인터럽트를 막게됩니다. 이것의 해결법읜 꽤나 직관적입니다. node
를 명령어로 사용하는 것입니다.
FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY . /app
EXPOSE 8080
USER node
## use node instead of npm/yarn
CMD ["node", "index.js"]
만약 npm start
를 하실 때 전달하는 환경 변수가 있었다면 컨테이너 안에서 ENV
라는 것으로 전달할 수 있습니다.
Bcrypt
Bcrypt는 패스워드 해싱을 위한 유명한 라이브러리지만 node:alpine
컨테이너에서는 동작하지 않습니다. 그래서 사람들은 node
, node:slim
을 설치하지만 alpine
보다는 훨씬 무겁습니다. 이러한 것은 꽤나 잘 알려진 문제점이죠. 이것을 해결하는 방법은 npm 패키지들을 설치하기전에 추가적인 패키지와 파이썬을 설치하는 것입니다.
FROM node:12-alpine
WORKDIR /app
COPY package.json /app/packagejson
## install required packages before npm
RUN apk --no-cache add --virtual builds-deps build-base python
RUN npm install
COPY . /app
EXPOSE 8080
USER node
CMD ["node", "index.js"]
지금까지 도커로 작업할 때 빠르게 적용할 수 있는 팁들을 살펴봤습니다. 그러나 여기서 그치지 마시고 도커 베스트 프랙티스도 꼭 읽어보시기 바랍니다.
Summary
- 도커 권한 / 실행 명령어 / 패키지 설치를 위한 팁