如何将其他依赖项安装到容器中?

Posted

技术标签:

【中文标题】如何将其他依赖项安装到容器中?【英文标题】:How can I install additional dependencies to the container? 【发布时间】:2022-01-22 09:58:40 【问题描述】:

我已经在我的集群中启动并运行了一个节点服务器(自动化工具)。但我想在 nodered 中添加对 Elasticsearch 的支持。

如果我在本地使用物理服务器 I would run npm install node-red-contrib-elasticsearch-jd(和我的叔叔 :-)。

但我是 Kubernetes 的新手,我该怎么做?用ConfigMap?我猜该容器还需要安装 npm 工具。

有什么建议吗?

【问题讨论】:

你需要写一个Dockerfile,你可以在其中添加RUN npm install node-red-contrib-elasticsearch-jd,然后build它来创建你自己的镜像,并将你的依赖加入其中 您需要将其托管在诸如 Docker 集线器之类的平台上,如果 docker 映像存储库是私有的,则使用密钥导入它。参考这里kubernetes.io/docs/tasks/configure-pod-container/… 【参考方案1】:

如果您想向正在运行的容器添加内容,可以在 Pod 中执行命令,就像在物理服务器上一样。

kubectl exec -it target-pod-name -- npm install node-red-contrib-elasticsearch-jd

但是,上面的命令只是将包添加到容器中,所以当你重启容器时,你需要同样的过程重新安装依赖。

如果你想让它永久化,你需要创建 Dockerfile 并从你使用的镜像重新构建一个镜像。

Dockerfile:

FROM your-image
RUN npm install node-red-contrib-elasticsearch-jd 

然后执行docker build 构建一个新的镜像。如果你使用新镜像,它应该和以前一样工作,但安装了一个新的依赖项。

【讨论】:

【参考方案2】:

我认为解决这个问题有三种好方法。

第一个是use postStart handler in your pod / deployment file。在您的情况下,它将如下所示:

...
containers:
  - name: your-pod
    image: your-image
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "npm install node-red-contrib-elasticsearch-jd"]

它将从command块immediately after a container is started运行命令:

Kubernetes 会在容器启动后立即发送 postStart 事件

使用 postStart 处理程序安装 curl 包的 nginx 部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  selector:
    matchLabels:
      app: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "apt update && apt -y install curl"]

第二个是run command in the running container:

kubectl exec -it your-pod-name -- npm install node-red-contrib-elasticsearch-jd

这是临时的(重新启动后将没有包),如果您希望此包在重新启动后永久存在,请添加 postStart 处理程序(如前所述)或构建新的 Docker 映像(如下)。

最后一个,如 cmets 中所建议的,是从以下 Dockerfile 构建新的 Docker 映像:

FROM your-image-name
RUN npm install node-red-contrib-elasticsearch-jd

然后您可以upload newly built image to the registry 并从那里提取它 - 如果您使用的是私有注册表,则需要configure Kubernetes by adding credentials and refer to them in the pod / deployment file。

【讨论】:

postStart 不起作用,因为 Node-RED 在启动时会扫描节点,因此以这种方式安装意味着它永远不会加载。扩展容器是正确的,但您需要确保安装发生在 /data 中,或者是全局的以发挥最佳效果。 好吧,OP 写道,他需要特定的依赖关系,仅此而已(“如果我使用物理服务器进行本地部署,我将运行 npm install node-red-contrib-elasticsearch-jd (并且鲍勃我的叔叔:-)",所以我提出了一种通过使用 Kubernetes 功能来实现这一点的方法..;)【参考方案3】:

第一种方法应该是使用 Node-RED 中内置的 Palette Manager 来安装节点。您可以从编辑器右上角的菜单中访问它。

如果您已将卷挂载到容器的 /data 目录,那么这应该在容器重新启动后保持不变。

如果您希望容器的所有实例都预先安装节点,那么您需要扩展官方 Node-RED 容器(或构建完全自定义的容器)。

使用以下 Dockerfile 构建容器应该可以,但如果您需要添加任何本机 pre-req,请务必记住基本容器是基于 Alpine 容器构建的

FROM nodered/node-red
RUN npm install node-red-contrib-elasticsearch-jd

【讨论】:

以上是关于如何将其他依赖项安装到容器中?的主要内容,如果未能解决你的问题,请参考以下文章

如何部署 OSGi 应用程序和依赖项?

Azure webjobs - Unity - 如何将范围内的依赖项注入其他类

如何将通过 npm 安装的所有依赖项保存到我的 package.json 文件中?

如何强制 npm 3 安装嵌套依赖项?

如何在安装项目中排除依赖项?

在 docker 容器内安装依赖项后如何复制回主机 package-lock.json/yarn.lock?