首页 > 解决方案 > 向作业发送参数

问题描述

我有一个基本上运行一次性脚本的 docker Image。该脚本需要 3 个参数。我的码头文件是

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"]

当我使用它启动 contianer 时,docker run -e URL=someUrl -e USER=someUser -e PASSWORD=somePassword -itd <IMAGE_ID>它工作得非常好。

现在我想将其部署为一项工作。

我的基本工作如下:

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 作为命令并尝试执行它们。那是对的吗 ?我能做些什么来解决这个问题?

标签: kuberneteskubernetes-jobs

解决方案


在您编写的 Dockerfile 中,发生了两件事:

  1. URL、用户名和密码在图像中是固定的。任何可以获取图像的人都可以运行docker history并以纯文本形式查看它们。

  2. 容器启动不带任何参数;它只是运行带有固定参数集的单个命令。

特别是因为您计划在执行时传递这些参数,所以我不会费心尝试将它们包含在图像中。我会将 Dockerfile 减少到:

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"]

当你启动它时,Kubernetesargs:会作为命令行参数传递给入口点。(这与 Docker Composecommand:和普通命令末尾的自由格式命令相同docker run。)使脚本成为容器入口点将使您的 Kubernetes YAML 以您期望的方式工作。

一般来说,我更喜欢使用 CMD 来代替 ENTRYPOINT。(除其他外,它可以更轻松地docker run --rm -it ... /bin/sh调试您的映像构建。)如果您这样做,那么 Kubernetesargs:需要包含它正在运行的脚本的名称:

args: ["./register.sh", "someUrl", "someUser", "somePassword"]

推荐阅读