使用 Kubernetes cronjob 和 dockerfile 出现 No such file or directory 错误
getting a No such file or directory error with Kubernetes cronjob and 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
我有一个脚本,我想 运行 使用如下所示的 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