【问题标题】:How to install external dependencies from my Node.js app?如何从我的 Node.js 应用程序安装外部依赖项?
【发布时间】:2020-11-11 02:23:29
【问题描述】:

我对 Node.js 很陌生。我创建了一个 Web 应用程序并使用 https://github.com/vercel/pkg 将其打包。该应用程序依赖于 Docker Engine,并使用 Docker 套接字/var/run/docker.sock 来利用它的 API。

var express = require('express');
var router = express.Router();

/* Create Container. */
router.get('/', function(req, res, next) {
  var Docker = require('dockerode');
  var docker = new Docker({socketPath: '/var/run/docker.sock'});
  docker.createContainer({Image: 'ubuntu', Cmd: ['/bin/bash'], name: 'ubuntu-test'}, function (err, container) {
    res.send("Container created");
  });
});

module.exports = router;

我想将应用程序作为独立的可执行文件与我的团队一起分发。我不希望他们单独安装外部依赖项,例如 Docker 在这种情况下

那么如何将这个 docker-engine 打包到我的应用中?如果无法打包,如何从我的 Node.js 应用程序将其安装在客户端计算机上?

【问题讨论】:

    标签: node.js docker package


    【解决方案1】:

    您颠倒了正常的依赖顺序,破坏了大多数应用程序使用的逻辑。 Docker 通常是提供映像中所有依赖项的工具。这避免了用户需要在他们的机器上安装 Node.js 或除 docker 以外的任何东西。由于一切都是基于 Linux 的容器,因此无需处理特定于平台的代码。

    通过反转逻辑,您现在需要打包特定于平台的 docker 安装程序,并要求用户已安装并配置 Node.JS 及其主机上的任何其他依赖项。该 docker 安装程序非常重要,往往需要管理访问权限,并且在 Windows 和 Mac 上涉及用于 Linux 环境的 VM。您还会发现套接字名称 (/var/run/docker.sock) 可能不适用于 Linux 环境之外,这使得 Node.JS 应用程序需要针对每种类型的 docker install 进行更多自定义。

    我不知道有任何简单的方法可以从 Node.JS 以独立于平台的方式执行此操作。只是为了在 Linux 上安装,我倾向于打包一个包含多个角色的 Ansible 剧本来执行安装,以及先决条件、内核调整和设置以信任用户可以访问 docker 引擎。将其扩展到 Windows 和 Mac 需要付出很多额外的努力,并且您的用户仍然需要在其本地计算机上提供 Node.JS 才能做到这一点。

    相反,我的建议是将您的 Node.JS 应用程序打包为 docker 镜像,因此用户只需要安装 Docker,它旨在打包其他应用程序。

    【讨论】:

    • 您能否简要介绍一下 Kitematic 或 Docker for Desktop 的功能?他们是否还在客户的机器上安装了 docker?我还有另一个问题,我可以隔离特定于我的应用程序的 docker 环境吗?例如,我不希望用户看到使用 docker ls 的容器,这些容器是由这个应用程序创建的
    • @SkyRar Kitematic 是过去与 Docker Desktop 捆绑在一起的遗留产品。好久没听说有人用了我不会基于此建立任何新的解决方案。
    • 您对运送静态 docker 守护进程 docs.docker.com/engine/install/binaries 有何看法?
    猜你喜欢
    • 2021-02-24
    • 1970-01-01
    • 2018-03-07
    • 2020-03-01
    • 2014-10-16
    • 2022-12-24
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多