2016-08-10 6 views
3

간단한 node.js 앱이 있다고 가정합니다. 나는이 같은 간단한 Dockerfile으로 응용 프로그램을 실행하기 위해 컨테이너를 구축 할 수 있습니다 :Docker : 개발 및 프로덕션 환경을위한 모범 사례

FROM ubuntu:16.04 
RUN apt-get update && apt-get install -y nodejs nodejs-legacy npm 
COPY . /app 
WORKDIR /app 
RUN npm install 
CMD node index.js 

이는 용기에 소스 코드를 복사하고 난 레지스트리에 문제 떨어져 그것을 제공 할 수 없습니다.

그러나 개발을 위해 코드의 모든 변경 사항에 대해 컨테이너를 다시 작성하고 싶지 않습니다. 그래서 자연스럽게, 나는 nodemon과 함께 볼륨을 사용합니다. 내 질문은 다음과 같습니다.

  • 어떻게 다른 구성을 유지합니까? 두 개의 dockerfiles? 두 가지 다른 작성 파일로 작성하십시오.
  • 내 호스트의 node_nodules 폴더가 컨테이너에서 필요한 폴더와 다릅니다 (즉, 일부 패키지가 호스트에 전역으로 설치됨). 볼륨에서 제외 할 수 있습니까? 그렇다면 볼륨을 마운트 한 후 npm install을 실행해야합니다. 어떻게해야합니까?

그럼 내 질문은 정말로 : 어떻게하면 dev 환경을 유지하고 배포 할 수 있습니까? 두 개의 Dockerfiles? 두 개의 작성 파일? 모범 사례가 있습니까?

+0

가 생산 개발에서 다른 무엇 ** 재시작을 할 src 디렉토리에 다른 파일을 변경해야 폴더? 그 환경을 사용할 수 있습니까? –

답변

5

그래서 내가 처리하는 방식에는 2 개의 Docker 파일 (Dockerfile 및 Dockerfile.dev)이 있습니다. Dockerfile.dev에서

내가 가진 :

FROM node:6 

# Update the repository 
RUN apt-get update 

# useful tools if need to ssh in or used by other tools 
RUN apt-get install -y curl net-tools jq 

# app location 
ENV ROOT /usr/src/app 

COPY package.json /usr/src/app/ 

# copy over private npm repo access file 
ADD .npmrc /usr/src/app/.npmrc 

# set working directory 
WORKDIR ${ROOT} 

# install packages 
RUN npm install 

# copy all other files over 
COPY . ${ROOT} 

# start it up 
CMD [ "npm", "run", "start" ] 

# what port should I have 
EXPOSE 3000 

내 NPM 스크립트는이

"scripts": { 
    .... 
    "start": "node_modules/.bin/supervisor -e js,json --watch './src/' --no-restart-on error ./index.js", 
    "start-production": "node index.js", 
    .... 
}, 

처럼 당신은 그것을 알 때문에 SRC 아래의 모든 파일에 대한 변경 사항이 발생합니다 시작을위한 관리자를 사용하여 도커로 다시 시작하지 않고도 서버를 다시 시작할 수 있습니다.

마지막으로 도커 작성입니다.

dev: 
    build: . 
    dockerfile: Dockerfile.dev 
    volumes: 
    - "./src:/usr/src/app/src" 
    - "./node_modules:/usr/src/node_modules" 
    ports: 
    - "3000:3000" 

prod: 
    build: . 
    dockerfile: Dockerfile 
    ports: 
    - "3000:3000" 

그래서 당신이 개발자 모드에서 볼 그것은 컨테이너에 현재 디렉토리의 src 폴더를 마운트로드도는/usr/src에/응용 프로그램/SRC와는/usr/src에/node_modules에 node_modules 디렉토리에서.

이렇게하면 로컬에서 변경하고 저장할 수 있습니다. 볼륨이 컨테이너의 파일을 업데이트하면 수퍼바이저는 변경 사항을보고 서버를 다시 시작합니다.

**는 node_modules를 시청하지 않는 참고하면

4

환경 변수를 사용하십시오. 설명서 Docker env을 참조하십시오. 이는 프로덕션에서 사용하기에 권장되는 방법입니다.

+1

예 :도커 실행 -e FOO_VAR = $ FOO_VAR –

1

VOLUME 섹션을 선언하는 단일 Dockerfile을 사용할 수 있습니다.

docker run-v <path>:<path> 옵션을 명시 적으로 지정하지 않으면 볼륨이 마운트되지 않습니다. 이 값을 부여하면 찌푸린 환경에서도 여러 개의 VOLUME을 선언 할 수 있습니다.

관련 문제