k8s 中传递参数给docker容器


在 Kubernetes 中,可以通过多种方式将参数传递给 Dockerfile 或其运行的容器,常见的方式包括使用环境变量、命令行参数、配置文件等。以下是一些常用的方法:

docker启动时传递参数

dockerfile 文件如下:

FROM ubuntu:22.04

# 设置工作目录
ENV WORKDIR_PATH=/home/test

# 设置时区
ENV TZ Asia/Shanghai

# 防止交互式提示
ENV DEBIAN_FRONTEND=noninteractive

# 默认选择开发环境的启动脚本
ENV ENTRYPOINT_PATH=$WORKDIR_PATH/start-dev.sh

WORKDIR $WORKDIR_PATH

# 复制启动脚本
COPY ./app/start-prod.sh $WORKDIR_PATH/start-prod.sh
COPY ./app/start-dev.sh $WORKDIR_PATH/start-dev.sh

# 给脚本赋予可执行权限
RUN chmod +x $WORKDIR_PATH/start-prod.sh $WORKDIR_PATH/start-dev.sh

# 确保 $ENTRYPOINT_PATH 解析是通过 shell 启动
ENTRYPOINT ["/bin/sh", "-c", "exec $ENTRYPOINT_PATH $@"]

CMD ["--help"]

start-prod.sh

#!/bin/bash

echo "start prd sh"
echo $@
echo $1
echo $2
echo $MESSAGE

start-dev.sh

#!/bin/bash

echo "start dev sh"

echo $@

构建镜像:

docker build -t test:v1 . -f Dockerfile

启动容器:


docker run -it --rm  test:v1 /bin/bash

在这里插入图片描述

指定prd脚本执行,启动容器

docker run -it --rm  -e ENTRYPOINT_PATH="/home/test/start-prod.sh" test:v1 /bin/bash

在这里插入图片描述

使用k8s env传递

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: test:v1
      env:
        - name: ENTRYPOINT_PATH
          value: "/home/test/start-prod.sh"
        - name: MESSAGE
          value: "hello world!"

运行pod:

kubectl apply -f pod.yaml

在这里插入图片描述

完全覆盖 ENTRYPOINT 和 CMD

apiVersion: v1
kind: Pod
metadata:
  name: my-pod2
spec:
  containers:
    - name: my-container
      image: test:v1
      command: [ "/bin/sh" ]
      args: [ "/home/test/start-prod.sh", "--param", "some_value" ]

在这里插入图片描述

### 如何在 Kubernetes (k8s) 中配置和使用 Docker 作为容器运行时 尽管 Kubernetes 已经逐步转向其他容器运行时,如 containerd,并且从 1.20 版本起不再直接支持 Docker[^5],仍然可以借助 `cri-dockerd` 来实现这一目标。以下是具体的操作方法: #### 修改 Kubelet 配置文件 当 kubelet.conf 文件内未指定任何关于容器运行时的具体参数时,为了使 Kubernetes 能够识别并利用 Docker 进行工作负载的管理,需按照特定流程调整设置以启用 Docker 作为容器运行时[^2]。 对于大多数 Linux 发行版,默认情况下,kubelet 将查找位于 `/etc/kubernetes/kubelet.conf` 的配置文件来获取启动选项。此时应编辑此文件或通过命令行传递相应的标志位给 kubelet,告知其采用 Docker 并指明 socket 地址通常为 unix:///var/run/docker.sock[^4]。 #### 安装 cri-dockerd 由于官方已停止对原生 Docker API 的支持,因此需要安装额外组件——即 `cri-dockerd`,这是一个适配层,使得旧版本中的 Docker 可继续充当 CRI(Container Runtime Interface)的一部分发挥作用。该工具会监听标准的 gRPC 接口并将请求转发至底层的 Docker Engine 实现交互操作。 ```bash # 下载并解压最新稳定版 cri-dockerd wget https://github.com/Mirantis/cri-dockerd/releases/latest/download/cri-dockerd-linux-amd64.tar.gz tar zxvf cri-dockerd-linux-amd64.tar.gz -C /usr/local/bin/ # 创建 systemd 单元文件以便服务自启 cat <<EOF | sudo tee /etc/systemd/system/cri-docker.service [Unit] Description=CRI interface for Docker After=docker.service Requires=docker.service [Service] ExecStart=/usr/local/bin/cri-dockerd Restart=always [Install] WantedBy=multi-user.target EOF # 启动并设置开机自动加载 sudo systemctl daemon-reload sudo systemctl enable --now cri-docker.service ``` 完成上述步骤之后,重启整个节点上的 kubelet 服务确保更改生效即可让集群内的 Pod 开始基于 Docker 执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值