node.js - 在开发工作流程中使用 docker

标签 node.js docker boot2docker

我在 OS X 上使用 boot2docker 并克隆了以下 repo:

https://github.com/enokd/docker-node-hello

它基本上有一个 Dockerfile 和一个打印 hello world 的非常简单的 express 应用程序。当我构建和运行镜像时,一切都运行良好,但当然,如果我在我的 Mac 上对 index.js 进行任何更改,这些都不会反射(reflect)在我正在运行的镜像中。我似乎找不到任何关于如何设置 docker 的引用资料,以便我可以在我的开发环境中运行它以自动获取我的源代码更改,所以我觉得我“做错了”。有什么建议吗?

这是我目前的运行方式(我没有使用 Vagrant,不太确定这是否有什么不同):

$ docker build -t gasi/centos-node-hello .
$ docker run -p 49160:8080 -d gasi/centos-node-hello
$ curl localhost:49160

更新:添加了我最终所做的答案。

更新:使用 boot2docker 1.3+ 和图添加了更多当前答案。

最佳答案

您的问题真的很有趣,并且(部分)与 Docker 无关。 让我说,这里主要和最后一个问题是虚拟机的使用。

当您使用 VM(裸 Virtualbox VM、Vagrant VM、Docker boot2docker VM...)时,跟踪主机上的代码更改可能是一项挑战

VM 是 Mac(发生代码更改的地方)和应用程序堆栈(这里是运行在微型 Linux VM 上的 Docker 容器)之间的完整抽象层。

  • 您必须在您的 Mac 和 boot2docker 之间的 Virtualbox 中明确定义一个共享文件夹(NFS,...)。此共享文件夹将是您的代码存储库的根目录。这是第一步。

    Mac:/Users/You/stuff/approot ===> boot2docker:/something


  • 然后,您必须告诉您的 Docker 容器使用绑定(bind)到 boot2docker 的 Volume(docker 术语),并将您的 Docker 应用程序指向它:
   docker run -v /something:/app/path/inside/docker -p 49160:8080 \
     -d gasi/centos-node-hello /usr/bin/node /app/path/inside/docker/index.js


  • 让 NodeJs 检测文件更改是另一个挑战。您需要一个额外的包装器来监视文件系统并在代码更改时重新启动 Node (ForeverNodemon ...)。

  • 而且,在那之后,由于更改不会发生在本地文件系统上,而是发生在共享文件夹上,您可能必须告诉 Nodejs 观察程序 (Forever/Nodemon/...) 使用轮询模式。它可以工作(或多或少),但会消耗大量 CPU。

关于node.js - 在开发工作流程中使用 docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796772/

相关文章:

node.js - Socket.io限制数据包数量

docker - 让 Docker 在 Mac 上识别 nvidia 显卡

node.js - 从 firestore 获取文档列表

node.js - Nodejs mocha单元测试sqlite3回调未调用插入未执行

postgresql - Docker - 如何在 Docker 容器中制作/安装扩展?

docker-compose 解析 url 中的主机名

c# - docker 镜像构建到使用 Azure Devops 管道部署的 ACR 期间的环境变量

Docker 客户端执行

boot2docker - 如何让 docker-machine 使用本地 boot2docker.iso

javascript - NodeJS nodemailer - IIS SMTP 虚拟服务器