有没有人知道为什么这个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"]