如何将其他依赖项安装到容器中?
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
【讨论】:
以上是关于如何将其他依赖项安装到容器中?的主要内容,如果未能解决你的问题,请参考以下文章
Azure webjobs - Unity - 如何将范围内的依赖项注入其他类