Docker使用NodeJS应用程序

时间:2016-07-16 00:24:23

标签: node.js docker docker-compose

我正在努力实现一些令人难以置信的基本功能,但现在已经进行了几个晚上,但仍然没有找到可靠的(或任何)解决方案。我在SO上发现了一些类似的主题,并按照那里的内容但无济于事,所以我为我的特定情况创建了一个GitHub仓库。

我正在尝试做什么:

  • 能够使用docker-compose up -d配置NodeJS应用程序(我计划将来再添加容器,在此示例中省略)
  • 确保代码是通过volumes映射的,因此每次我在本地更改某些代码时都不需要重新构建代码。

我的猜测是我遇到的问题与volumes的映射有关,导致某些文件在容器中丢失/覆盖,例如在我尝试过的某些变体文件夹中正在映射,但个别文件不是。

我创建了一个简单的回购来说明我的问题,只是结帐并运行docker-compose up -d来查看问题,容器因以下原因而死:

Error: Cannot find module '/src/app/app.js'

回购链接的链接在这里:https://github.com/josephmcdermott/nodejs-docker-issue,PR的欢迎,如果有人能为我解决这个问题,我将永远感激。

更新:请参阅下面的解决方案代码,谢谢ldg

Dockerfile

FROM node:4.4.7

RUN mkdir -p /src
COPY . /src
WORKDIR /src
RUN npm install

EXPOSE 3000

CMD ["node", "/src/app.js"]

搬运工-compose.yml

app:
  build: .
  volumes:
    - ./app:/src/app

文件夹结构:

- app
- - * (files I want to sync and regularly update)
- app.js (initial script to call files within app/)
- Dockerfile
- docker-compose.yml
- package.json

2 个答案:

答案 0 :(得分:3)

在您的撰写文件中,最后一行- /src/app/node_modules可能会映射到您之前的卷。如果挂载/ scr / app,则将在该链接卷中创建node_modules。所以它看起来像这样:

app:
  build: .
  volumes:
    - ./app:/src/app

如果您确实希望将整个/app目录保存为链接卷,则需要在启动容器时执行npm install(这样可以确保它获取任何更新)或< strong>不链接卷并更新Dockerfile以复制整个/app目录。这很好,因为它为您提供了一个独立的图像。我通常以这种方式Dockerize我的Node.js应用程序。您也可以根据需要运行npm test来验证图片。

如果您需要为您希望能够编辑的脚本文件创建链接卷(或者如果您的应用程序生成副作用),则可以通过Docker卷链接该目录或文件。

顺便说一下,如果你想确保以后不复制该目录的内容,请将其添加到。dockerignore(以及.gitignore)。

答案 1 :(得分:0)

注意末尾的“/”

volumes:
    - ./app:/src/app/

此声明不正确

volumes:
    - ./app:/src/app