文章目录
- docker启动时传递参数
- 使用k8s env传递
- 完全覆盖 ENTRYPOINT 和 CMD
在 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.shWORKDIR $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/bashecho "start prd sh"
echo $@
echo $1
echo $2
echo $MESSAGE
start-dev.sh
#!/bin/bashecho "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-containerimage: test:v1env:- name: ENTRYPOINT_PATHvalue: "/home/test/start-prod.sh"- name: MESSAGEvalue: "hello world!"
运行pod:
kubectl apply -f pod.yaml
完全覆盖 ENTRYPOINT 和 CMD
apiVersion: v1
kind: Pod
metadata:name: my-pod2
spec:containers:- name: my-containerimage: test:v1command: [ "/bin/sh" ]args: [ "/home/test/start-prod.sh", "--param", "some_value" ]