2016-07-13 71 views
5

我有一個hello,world表示我使用nodemon運行的應用程序,以便每當更改文件時服務器重新啓動。Docker:使用nodemon重新加載nodejs應用程序

我將應用程序打包爲泊塢窗圖像。

Dockerfile

FROM node:6.3.0 

RUN mkdir -p /opt/app 
WORKDIR /opt/app 

COPY . /opt/app 

RUN npm install 

EXPOSE 3000 

CMD ["npm", "start"] 

npm start運行nodemon -L index.jspackage.json

限定。然而,我不能建立像每次我做出改變對我的應用程序。 我也有一個碼頭工人,compose.yml文件,在其中我指定build選項,但我仍然不能得到容器與

version: "2" 
services: 
    rpro: 
    build: . 
    command: npm start 
    ports: 
     - "3000:3000" 
    volumes: 
     - /opt/app 

這裏的entire repo


重裝

如何使用Docker容器實現服務器重啓文件更改?在這種情況下,通常的開發工作流程是什麼?

+0

docker-dev適合這種類型的東西,雖然我不認爲它應該在生產中運行 – meda

+0

@meda你能提供一個鏈接到docker-dev嗎? – Jatin

+0

對不起,我的意思是node-dev – meda

回答

8

啊,問題似乎是docker-compose.ymlvolumes param。 更改爲

volumes: 
    - .:/opt/app 

使它工作。它告訴碼頭將主機上的應用程序文件夾.掛載到容器中的/opt/app

然後在做了docker-compose up之後,服務器在文件更改的情況下重新啓動。

+0

在你的dockerfile裏你不需要執行RUN mkdir或COPY命令。您的來源和目的地在這裏是一樣的:'複製。/opt/app' – duhseekoh

1

不知道我是否會因爲通常的工作流而調用該問題 - 當容器中的文件發生更改時,會觸發重建。如果您沒有將文件放在容器中,則不會像@jatin提到的那樣執行此操作,您可以通過- .:/opt/app或類似方式鏈接您的撰寫目錄。

如果你這樣做,你不需要在你的版本中使用COPY . /opt/app,因爲它會掛載在那個目錄下。

當您注意docker-compose up --build時注意如果已安裝卷中的文件發生更改(如果構建中的文件發生更改),Docker將不會重新生成(重新啓動服務器)。由於看起來您正在通過nodemon觀看文件,因此您可能會重新啓動(因爲您使用的是傳統手錶,所以請注意,有些情況下它可能無法識別文件更改)。

這是發展基本正常,但是在生產,顯然你不希望使用watch,你很可能會使用泊塢窗監測,如果它退出重啓容器(restart: always)或使用進程管理器在非 - 守護進程模式。

+0

*「請注意,當您構建docker時」Docker不會重建(重新啓動服務器),如果裝入的卷中的文件發生更改(僅當構建中的文件發生更改)。「* 是不是反過來呢?如果我從docker-compose.yml中刪除'volumes'參數,然後執行'docker-compose up',那麼在每次更改後都明確執行'docker-compose build'時,將不會提取更改。 – Jatin

+0

是的,如果圖像已經被創建,你需要添加'--build'。但是,如果您確實使用'--build'並且沒有更改,則圖像和容器應保持不變。 – ldg

相關問題