gpt4 book ai didi

bash - Bash的版本? —在Docker的构建上下文中

转载 作者:行者123 更新时间:2023-12-02 20:58:34 26 4
gpt4 key购买 nike

Docker在容器构建阶段运行什么 shell 和该 shell 的哪个版本?

那就是-我有一个Dockerfile和下面的代码行。

RUN /path/to/a/script.bash

这将在Docker的构建阶段运行脚本。但是,当我构建Docker时,被一些常见的bash习惯绊倒了。例如,我的脚本中包含以下内容
urls=(
http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
http://apache.mirrors.pair.com/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
http://mirror.cc.columbia.edu/pub/software/apache/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
https://mirrors.ocf.berkeley.edu/apache/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
)

并且Docker在构建期间失败
/path/to/a/script.bash: 11: /path/to/a/script.bash: Syntax error: "(" unexpected

因此,当Docker通过 RUN运行脚本时,使用的是哪个Shell,以及该Shell的哪个版本。 (或者为什么要问错这个问题?)

最佳答案

除非您指定备用的 SHELL ,否则裸字符串的RUN命令将包装在/bin/sh -c中(在Linux上)。因此,这两个命令是等效的:

RUN /path/to/a/script.bash
RUN ["/bin/sh", "-c", "/path/to/a/script.bash"]

实际运行的shell是基础镜像的函数。通常,这是一个实现POSIX规范的 shell ,仅此而已;除非明确安装,否则基于 Alpine 的镜像根本不包含重量较重的GNU Bash。

还要注意,这与运行脚本所需的解释器不同,通常由脚本顶部的“shebang”行 #!/bin/sh表示。您可以使用这种方式 RUN任何脚本或可执行文件,只要它在文件顶部具有正确的声明即可。如果根本没有 #!行,则脚本将由基础图像中的 /bin/sh解释,这很可能不支持Bash扩展(数组变量, source,...)。

关于bash - Bash的版本? —在Docker的构建上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61616099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com