使用 Kubernetes cronjob 和 dockerfile

问题描述

我有一个脚本,我想使用如下所示的 dockerfile 运行:

FROM debian:unstable-slim

RUN apt-get update && apt-get install -y netcat-Traditional httpie postgresql-client

copY go.sh /tmp/go.sh

workdir /tmp
CMD ["bash","-c","/tmp/go.sh"]

它在本地运行良好,但我需要将它部署为 kubernetes cronjob,我有一个类似这样的配置文件

script:
- docker build -t {github_enterprise_url/org/repo} .

并且构建输出似乎没问题:

...
Step 3/7 : copY go.sh /tmp/go.sh
 ---> ab8d5227f65e
...
Successfully built e79162d90def

对于 cronjob yaml,除其他外,我有这样的东西:

spec:
  containers:
    - image: >-
        ${ trigger.artifacts.?[type == 'docker'].?[name matches
        'org/repo'].![reference][0] }

然后部署成功,但显示以下消息:

Cannot determine if job needs to be started: Too many missed start time (> 100). Set or decrease .spec.startingDeadlineseconds or check clock skew.

所以我尝试像这样手动运行它:

kubectl create job --from=cronjob/name name-manual-123

查看创建的 pod 的日志时,我得到了:

kubectl logs name-manual-123-ab1cd
bash: line 1: /tmp/go.sh: No such file or directory

有什么线索吗?

解决方法

/tmp 目录通常用于临时文件存储。在那里挂载 RAM 磁盘 (tmpfs) 很常见,而且 Kubernetes 设置可能会在您没有注意到的情况下执行此操作。

您可以通过将脚本存储在默认 PATH 上的位置来解决此问题,例如 /usr/local/bin

# /usr/local/bin,not /tmp
COPY go.sh /usr/local/bin

CMD ["go.sh"]
# will work when the script is executable; on $PATH (in /usr/local/bin);
# and has a correct shebang line
# #!/bin/sh