【问题标题】:Docker compose volume mapping with NodeJS appDocker 使用 NodeJS 应用程序编写卷映射
【发布时间】:2016-07-16 00:24:23
【问题描述】:

我正在尝试实现一些非常基本的东西,但是现在已经为此工作了几个晚上,但仍然没有找到可靠的(或任何)解决方案。我在 SO 上找到了一些类似的主题,并按照那里的内容进行操作,但无济于事,因此我为我的具体案例创建了一个 GitHub 存储库。

我正在尝试做的事情:

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

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

我创建了一个简单的 repo 来说明我的问题,只需结帐并运行 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"]

docker-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

【问题讨论】:

  • 仅供参考,您的代码足够短,您可以在此处发布(至少相关部分)(鼓励简单链接)。

标签: node.js docker docker-compose


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 您好,ldg,感谢您的回复。我已经尝试了您的建议,只要我不在 docker-compose.yml 中包含任何卷,我就可以让“自包含”图像正常工作,但是一旦我尝试映射目录以便于开发它'消失”。我已将最新版本提交到同一个 github 存储库(我想使用 github 存储库而不是在此处粘贴代码,因为我知道我会进行这样的更改,并且差异可能很有用)。我得到的最新版本Error: Cannot find module './app/someFile.js'
  • 它现在对我有用。您可以尝试全新安装,如果仍然出现错误,请概述步骤?
  • 本地与外部更多的是帮助他人。来自stackoverflow.com/help/how-to-ask:“...创建一个您可以链接到的问题的实时示例然后这样做 - 但也包括您的问题本身的代码。不是每个人都可以访问外部站点,并且链接可能会随着时间的推移而中断。 "
  • “它现在对我有用” - 是的,你是对的,我上次尝试时一定错过了构建。非常感谢您的支持 ldg 和您的评论:本地与外部是有道理的,我将使用正确的代码更新原始问题。
【解决方案2】:

注意末尾的“/”

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

此声明不正确

volumes:
    - ./app:/src/app

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2021-11-06
    • 2012-01-17
    • 1970-01-01
    • 2022-07-15
    • 2017-12-09
    • 2022-07-06
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多