Docker 使用 NodeJS 应用程序组成体积映射
Docker compose volume mapping with NodeJS app
我正在尝试实现一些非常基本的东西,但现在已经为此做了几个晚上,但仍然没有找到可靠的(或任何)解决方案。我在 SO 上找到了一些类似的主题并遵循了那里的内容但无济于事,所以我为我的具体案例创建了一个 GitHub 回购协议。
我想做什么:
- 能够使用
docker-compose up -d
提供 NodeJS 应用程序(我计划在未来添加更多容器,在此示例中省略)
- 确保代码通过
volumes
映射,这样我就不必每次在本地更改某些代码时都重新构建。
我猜我遇到的问题与 volumes
的映射有关,导致某些文件在容器内 lost/overwritten,例如在我的某些变体中我试过正在映射文件夹,但没有映射单个文件。
我创建了一个简单的 repo 来说明我的问题,只需签出并 运行 docker-compose up -d
查看问题,容器因以下原因而死:
Error: Cannot find module '/src/app/app.js'
回购的 link 在这里:https://github.com/josephmcdermott/nodejs-docker-issue,欢迎 PR,如果有人能为我解决这个问题,我将永远感激不已。
更新:请参阅下面的解决方案代码,感谢 ldg
Docker 文件
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
在您的撰写文件中,最后一行 - /src/app/node_modules
可能映射到您之前的卷。如果您挂载 /scr/app,那么 node_modules 将在该 linked 卷中创建。所以它看起来像这样:
app:
build: .
volumes:
- ./app:/src/app
如果您确实想将整个 /app
目录保留为 linked 卷,您需要在启动容器时执行 npm install
(这将确保它获取任何更新)或者 不要 link 卷并更新您的 Docker 文件以复制整个 /app
目录。这很好,因为它为您提供了一个独立的图像。我通常 Docker 以这种方式调整我的 Node.js 应用程序。也可以运行npm test
酌情验证图片
如果您需要为您希望能够编辑的脚本文件创建一个 linked 卷(或者如果您的应用会产生副作用),您可以 link 只创建该目录或通过 Docker 卷归档。
顺便说一句,如果您想确保以后不复制该目录的内容,请将其添加到 .dockerignore(以及 .gitignore)。
注意最后的'/'
volumes:
- ./app:/src/app/
此声明不正确
volumes:
- ./app:/src/app
我正在尝试实现一些非常基本的东西,但现在已经为此做了几个晚上,但仍然没有找到可靠的(或任何)解决方案。我在 SO 上找到了一些类似的主题并遵循了那里的内容但无济于事,所以我为我的具体案例创建了一个 GitHub 回购协议。
我想做什么:
- 能够使用
docker-compose up -d
提供 NodeJS 应用程序(我计划在未来添加更多容器,在此示例中省略) - 确保代码通过
volumes
映射,这样我就不必每次在本地更改某些代码时都重新构建。
我猜我遇到的问题与 volumes
的映射有关,导致某些文件在容器内 lost/overwritten,例如在我的某些变体中我试过正在映射文件夹,但没有映射单个文件。
我创建了一个简单的 repo 来说明我的问题,只需签出并 运行 docker-compose up -d
查看问题,容器因以下原因而死:
Error: Cannot find module '/src/app/app.js'
回购的 link 在这里:https://github.com/josephmcdermott/nodejs-docker-issue,欢迎 PR,如果有人能为我解决这个问题,我将永远感激不已。
更新:请参阅下面的解决方案代码,感谢 ldg
Docker 文件
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
在您的撰写文件中,最后一行 - /src/app/node_modules
可能映射到您之前的卷。如果您挂载 /scr/app,那么 node_modules 将在该 linked 卷中创建。所以它看起来像这样:
app:
build: .
volumes:
- ./app:/src/app
如果您确实想将整个 /app
目录保留为 linked 卷,您需要在启动容器时执行 npm install
(这将确保它获取任何更新)或者 不要 link 卷并更新您的 Docker 文件以复制整个 /app
目录。这很好,因为它为您提供了一个独立的图像。我通常 Docker 以这种方式调整我的 Node.js 应用程序。也可以运行npm test
酌情验证图片
如果您需要为您希望能够编辑的脚本文件创建一个 linked 卷(或者如果您的应用会产生副作用),您可以 link 只创建该目录或通过 Docker 卷归档。
顺便说一句,如果您想确保以后不复制该目录的内容,请将其添加到 .dockerignore(以及 .gitignore)。
注意最后的'/'
volumes:
- ./app:/src/app/
此声明不正确
volumes:
- ./app:/src/app