2016-07-05 48 views
0

我的週末項目是探索Docker,我認爲一個簡單的node.js項目會很好。通過「實時編輯」,我的意思是我希望能夠在我的主機系統上操作文件,並且(儘可能少的努力)看到Docker容器立即反映這些更改。如何獲取node.js「實時編輯」與Docker配合使用

Dockerizing a Node.js web app進展順利,然後谷歌搜索和thrashing開始。我想,我現在瞭解以下內容:

  • 如果我使用ADD方法的教程的NodeJS指出的,那麼我就可以不用現場編輯,因爲ADDdocker build(不docker run)完全實現。

  • 如果我安裝節點項目的目錄的東西,如-v `pwd`:/usr/src/app,那麼它將無法運行,因爲無論node_modules不存在(且體積不可用在構建時得到填充,因爲-vdocker run參數)或者我需要在主機的項目目錄中預先填充node_modules,這只是不舒服,可能會遇到操作系統兼容性問題。

我這個瘋狂的新手顛簸可以提煉成三次嘗試,每次都有自己的缺點或明顯的失敗。

1)Node.js教程使用ADD完美工作,但沒有「實時編輯」。我沒有期望這應該是我需要的,但它至少證明我有基本的佈線和運行。

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到一個臨時位置,並得到node_modules設置,然後移動到主機的項目目錄,然後用-v `pwd`:/usr/src/app安裝項目的目錄。如果這可以工作,我會試圖添加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 

我懷疑有不理解一些基本的概念,我的多個實例,但是當我搜索周圍好像有很多不同的方法,有時增加的項目需求複雜。我可能愚蠢地試圖保持簡單。 :)

統計:

  • 運行在Mac OS 10.10
  • 多克爾1.12.0-RC2-beta17(最新在寫作時)
  • Kitematic 0.12.0(最遲在寫本新聞時)
  • Node.js 4.4。7(最新的前6在寫作時)

UPDATE:試圖扯些什麼,我已經試過一起學習,我已經做了以下並且有更好的運氣。現在它建立,但docker run -v `pwd`:/usr/src/app -p 49160:8080 -d martink/node-docker3不保持運行。但是,我可以在Kiteomatic中「運行」和「執行」,並且在shell中,我可以看到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得到了我所需要的。

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 build -t martink/node-docker . 

而像這樣運行:

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

這...

  • 保持運行
  • 作出響應, EXPEC特德在http://localhost:49160
  • 立即拿起對主機的文件進行了更改server.js

我很高興,看來我這個工作。如果我在那裏有任何不好的做法,我會很感激反饋。 :)

相關問題