2016-07-05 1 views
0

주말 프로젝트가 Docker를 탐색하는 것이었고 간단한 node.js 프로젝트가 좋을 것이라고 생각했습니다. "실시간 편집"이란 호스트 시스템에서 파일을 조작하고 가능한 한 적은 노력으로 도커 컨테이너가 변경 사항을 즉시 반영하는 것을보고 싶습니다.node.js를 Docker와 함께 작동하도록 "라이브 편집"을 수행하는 방법

Dockerizing a Node.js web app 부드럽게 진행된 다음 인터넷 검색 및 스래 싱이 시작되었습니다. 나는 이제 다음 알고 있다고 생각 : 나는 ADD 방법은 nodejs 자습서에 언급 사용하는 경우 ADD이 (docker run에서하지) docker build에서 완전히 충족되기 때문에

  • 가, 나는 라이브 편집 할 수 없습니다.

  • 내가 -v `pwd`:/usr/src/app 같은과 노드 프로젝트의 디렉토리를 마운트하는 경우 (-vdocker run 인수 있기 때문에 볼륨이 채워 할 빌드시 사용할 수 없습니다) node_modules이 존재하지 않거나 때문에, 그것은 실행되지 않습니다 또는 호스트의 프로젝트 디렉토리에 node_modules을 미리 채울 필요가 있습니다.이 디렉토리는 올바르게 느끼지 않으며 OS 호환성 문제가있을 수 있습니다.

내 신기한 스레 싱은 각자의 단점이나 명백한 오류가있는 세 번의 시도로 증류 할 수 있습니다.

1) ADD을 사용하는 Node.js 튜토리얼은 완벽하게 작동하지만 "실시간 편집"은 없습니다. 나는 이것이 내가 필요로하는 것이어야한다는 기대를 가지고 있지는 않지만 최소한 기본 배선이 있고 작동하고 있음을 증명했다.

FROM node:argon 

# Create app directory 
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

# Install app dependencies 
COPY package.json /usr/src/app/ 
RUN npm install 

# Bundle app source 
COPY . /usr/src/app 

EXPOSE 8080 
CMD [ "npm", "start" ] 

2) 노드 종속성을 Dockerfile에서 전역으로 빌드 해보십시오. 이것은 덜 시원하지만 합리적인 것으로 보였습니다 (의존성을 자주 바꿀 것으로 예상하지 않기 때문에). 그러나, 그것은 또한 간단하게 작동하지 않았고, 정말로 나를 놀라게했습니다. 빌드시

FROM node:argon 

RUN npm install -g express 

WORKDIR /usr/src/app 
# which will be added via `docker run -v...` 

EXPOSE 8080 

3), ADD에만 임시 위치에 package.json하고, 다음, 호스트의 프로젝트 디렉토리에 그 이동 후 -v `pwd`:/usr/src/app와 프로젝트의 디렉토리를 마운트 설정할 수 node_modules. 이게 효과가 있었다면 나는 nodemon을 추가하려고했고 이론적으로 내가 원하는 것을 가지고있었습니다. 이것은 나에게 가장 영리하고 상식적인 것으로 보였지만, 이것은 단순히 효과가 없었습니다. 필자는 호스트 디렉토리 사용 권한을 포함하여 수정을 시도하는 것에 약간의 기쁨을 느끼고 기뻐했습니다.

FROM node:argon 

WORKDIR /usr/src/app 

# Provides cached layer for node_modules 
ADD package.json /tmp/package.json 
RUN cd /tmp && npm install 
RUN cp -a /tmp/node_modules /usr/src/app/ 

EXPOSE 8080 

나는 몇 가지 기본 개념을 이해하지 못하는 날의 여러 인스턴스가 의심하지만 난 주위에 검색 때로는 추가 프로젝트 요구 사항에 의해 복잡하게 서로 다른 접근 방식이 많이가 있었다처럼 보였다. 나는 아마 어리석게도 그것을 단순하게 유지하려고 노력했다. :)

통계 :

  • 맥 OS에서 실행 10.10
  • 도커 1.12.0-RC2-beta17 (최신 글을 쓰는 시점에서)
  • Kitematic 0.12.0 (최신 글을 쓰는 시점에서)
  • Node.js 4.4.7

UPDATE (글을 쓰는 시점에서 사전 6 최신) : 내가 함께 배울 시도했다 일부를 끌어 시도, 나는 다음과 같은 일 더 나은 행운을 했어. 이제 빌드되지만 docker run -v `pwd`:/usr/src/app -p 49160:8080 -d martink/node-docker3은 계속 실행되지 않습니다. 그러나 나는 Kiteomatic에서 "Run"과 "Exec"을 할 수 있고 쉘에서는 node_modules이 잘 보이고 바른 위치로 옮겨졌으며 수동으로 node server.js을 수행하고 기쁨을 가질 수 있음을 알 수 있습니다.

FROM node:argon 

# Copy over the host's project files 
COPY . /usr/src/app 
# This provides a starting point, but will later be overridden by `-v`, I hope 

# Use this app directory moving forward through this file 
WORKDIR /usr/src/app 

# PULL TOGETHER `NODE_MODULES` 
## Grab the package.json from the host and copy into `tmp` 
COPY package.json /tmp/package.json 

## Use that to get `node_modules` set up in `tmp` 
RUN cd /tmp && npm install 

## Copy that resulting node_modules into the WORKDIR 
RUN cp -a /tmp/node_modules /usr/src/app/ 

EXPOSE 8080 

나는 내가 이것을 실행할 때
  • 가 어떻게 server.js 시작을해야합니까 ... 내 질문에 지금까지 깍 것 같아요?
  • "실시간 수정 사항"은 어떻게 볼 수 있습니까 (nodemon으로 시작할 수 있습니까?).

답변

0

이 Dockerfile이 필요한 것을 나타납니다.

docker build -t martink/node-docker . 

을 그리고처럼 실행 :

FROM node:argon 

# Adding `nodemon` as a global so it's available to the `CMD` instruction below 
RUN npm install -g nodemon 

# Copy over the host's project files 
COPY . /usr/src/app 
# This provides a starting point, but will later be overridden by `docker run -v...` 

# Use this app directory moving forward through this file 
WORKDIR /usr/src/app 

# PREPARE `NODE_MODULES` 
## Grab the `package.json` from the host and copy into `tmp` 
COPY package.json /tmp/package.json 

## Use that to get `node_modules` set up 
RUN cd /tmp && npm install 

## Copy that resulting `node_modules` into the WORKDIR 
RUN cp -a /tmp/node_modules /usr/src/app/ 

EXPOSE 8080 
CMD [ "nodemon", "./server.js" ] 

그래서 같이이 구축

docker run -v `pwd`:/usr/src/app -p 49160:8080 -d martink/node-docker 

이 ...

나는 내가이 작업이 보인다 행복 해요 호스트 컴퓨터의 파일을 만든 server.js 변경을 선택합니다. 거기에 나쁜 습관이 있다면 의견을 보내 주시면 감사하겠습니다. :)