【问题标题】: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/…

标签: elasticsearch kubernetes node-red


【解决方案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"]
    

    它将从commandimmediately 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 2021-05-22
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2019-01-04
      相关资源
      最近更新 更多