为什么码头工人"give executable file `/bin/sh` not found in $PATH"?



有没有人知道为什么这个Dockerfile

FROM docker.io/fluent/fluent-bit:1.6-debug
RUN ln -sf /usr/share/zoneinfo/Europe/Copenhagen /etc/localtime

STEP 1: FROM docker.io/fluent/fluent-bit:1.6-debug
STEP 2: RUN /usr/local/bin/ln -sf /usr/share/zoneinfo/Europe/Copenhagen /etc/localtime
2021-02-20T19:44:50.000358546Z: executable file `/bin/sh` not found in $PATH: No such file or directory
error running container: error creating container for [/bin/sh -c /usr/local/bin/ln -sf /usr/share/zoneinfo/Europe/Copenhagen /etc/localtime]: : exit status 1
Error: error building at STEP "RUN /usr/local/bin/ln -sf /usr/share/zoneinfo/Europe/Copenhagen /etc/localtime": error while running runtime: exit status 1

如果我这样做

$ docker run -ti fluent-bit:1.6-debug sh
ln -sf /usr/share/zoneinfo/Europe/Copenhagen /etc/localtime

然后它工作…

因为你的docker.io/fluent/fluent-bit:1.6-debug基础映像是基于一个分布式基础映像:https://docs.fluentbit.io/manual/installation/docker#multi-architecture-images

您可以进入shell并在容器中执行命令,因为您正在使用包含busybox的调试映像版本https://github.com/GoogleContainerTools/distroless debug-images

更多关于无极:https://github.com/GoogleContainerTools/distroless/blob/master/README.md

要实现您想要的功能,请指定shell为busybox sh函数,而不是这里不存在的默认/bin/sh。

FROM docker.io/fluent/fluent-bit:1.6-debug
SHELL ["busybox", "sh", "-c"]
RUN ln -sf /usr/share/zoneinfo/Europe/Copenhagen /etc/localtime

请记住,您只能在调试映像版本中执行此操作。还要记住,无损图像只意味着运行您的程序,而不是其他。

更新:

这个格式也可以:

FROM docker.io/fluent/fluent-bit:1.6-debug
RUN ["ln", "-sf",  "/usr/share/zoneinfo/Europe/Copenhagen", "/etc/localtime"]

因为https://docs.docker.com/engine/reference/builder/

运行RUN有两种形式:

  • RUN (shell形式),命令在shell中运行,其中由Linux默认为/bin/sh -c, Windows默认为cmd/S/C)
  • RUN ["executable", "param1", "param2"] (exec form)

exec形式可以避免shell字符串修改,并且可以使用不包含指定的shell可执行文件的基本映像运行命令。

FROM docker.io/fluent/fluent-bit:1.6-debug
RUN ["ln", "-sf",  "/usr/share/zoneinfo/Europe/Copenhagen", "/etc/localtime"]

相关内容

  • 没有找到相关文章

最新更新