向作业发送参数
Send arguments to a Job
我有一个基本上运行一次性脚本的 docker 图像。该脚本需要 3 个参数。我的 docker 文件是
FROM <some image>
ARG URL
ARG USER
ARG PASSWORD
RUN apt update && apt install curl -y
COPY register.sh .
RUN chmod u+x register.sh
CMD ["sh", "-c", "./register.sh $URL $USER $PASSWORD"]
当我使用 docker run -e URL=someUrl -e USER=someUser -e PASSWORD=somePassword -itd <IMAGE_ID>
启动 contianer 时,它工作得很好。
现在我想将其部署为作业。
我的基本工作如下:
apiVersion: batch/v1
kind: Job
metadata:
name: register
spec:
template:
spec:
containers:
- name: register
image: registeration:1.0
args: ["someUrl", "someUser", "somePassword"]
restartPolicy: Never
backoffLimit: 4
但是这个 pod 在
上出错了
Error: failed to start container "register": Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"someUrl\": executable file not found in $PATH"
看起来它正在将我的参数作为命令并尝试执行它们。那是对的吗 ?我该怎么做才能解决这个问题?
使用:
args: ["sh", "-c", "./register.sh someUrl someUser somePassword"]
在您编写的 Docker 文件中,发生了两件事:
图像中固定了URL、用户名和密码。任何能得到图像的人都可以 运行 docker history
并以纯文本形式查看它们。
容器启动不接受任何参数;它只是 运行 具有固定参数集的单个命令。
特别是因为您计划在执行时传递这些参数,所以我不会费心尝试将它们包含在图像中。我会将 Docker 文件缩减为:
FROM ubuntu:18.04
RUN apt update \
&& DEBIAN_FRONTEND=noninteractive \
apt install --assume-yes --no-install-recommends \
curl
COPY register.sh /usr/bin
RUN chmod u+x /usr/bin/register.sh
ENTRYPOINT ["register.sh"]
当您启动它时,Kubernetes args:
会作为命令行参数传递给入口点。 (这与 Docker Compose command:
和普通 docker run
命令末尾的自由格式命令相同。)使脚本成为容器入口点将使您的 Kubernetes YAML 以您期望的方式工作。
总的来说,我更喜欢使用 CMD 而不是 ENTRYPOINT。 (除其他外,它可以更轻松地 docker run --rm -it ... /bin/sh
调试您的映像构建。)如果您这样做,那么 Kubernetes args:
需要包含脚本的名称,它是 运行ning :
args: ["./register.sh", "someUrl", "someUser", "somePassword"]
我有一个基本上运行一次性脚本的 docker 图像。该脚本需要 3 个参数。我的 docker 文件是
FROM <some image>
ARG URL
ARG USER
ARG PASSWORD
RUN apt update && apt install curl -y
COPY register.sh .
RUN chmod u+x register.sh
CMD ["sh", "-c", "./register.sh $URL $USER $PASSWORD"]
当我使用 docker run -e URL=someUrl -e USER=someUser -e PASSWORD=somePassword -itd <IMAGE_ID>
启动 contianer 时,它工作得很好。
现在我想将其部署为作业。
我的基本工作如下:
apiVersion: batch/v1
kind: Job
metadata:
name: register
spec:
template:
spec:
containers:
- name: register
image: registeration:1.0
args: ["someUrl", "someUser", "somePassword"]
restartPolicy: Never
backoffLimit: 4
但是这个 pod 在
上出错了Error: failed to start container "register": Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"someUrl\": executable file not found in $PATH"
看起来它正在将我的参数作为命令并尝试执行它们。那是对的吗 ?我该怎么做才能解决这个问题?
使用:
args: ["sh", "-c", "./register.sh someUrl someUser somePassword"]
在您编写的 Docker 文件中,发生了两件事:
图像中固定了URL、用户名和密码。任何能得到图像的人都可以 运行
docker history
并以纯文本形式查看它们。容器启动不接受任何参数;它只是 运行 具有固定参数集的单个命令。
特别是因为您计划在执行时传递这些参数,所以我不会费心尝试将它们包含在图像中。我会将 Docker 文件缩减为:
FROM ubuntu:18.04
RUN apt update \
&& DEBIAN_FRONTEND=noninteractive \
apt install --assume-yes --no-install-recommends \
curl
COPY register.sh /usr/bin
RUN chmod u+x /usr/bin/register.sh
ENTRYPOINT ["register.sh"]
当您启动它时,Kubernetes args:
会作为命令行参数传递给入口点。 (这与 Docker Compose command:
和普通 docker run
命令末尾的自由格式命令相同。)使脚本成为容器入口点将使您的 Kubernetes YAML 以您期望的方式工作。
总的来说,我更喜欢使用 CMD 而不是 ENTRYPOINT。 (除其他外,它可以更轻松地 docker run --rm -it ... /bin/sh
调试您的映像构建。)如果您这样做,那么 Kubernetes args:
需要包含脚本的名称,它是 运行ning :
args: ["./register.sh", "someUrl", "someUser", "somePassword"]