如何在Alpine Docker容器中运行bash脚本

Kur*_*eek 34 bash docker dockerfile alpine-linux

我有一个只包含两个文件的目录,Dockerfile并且sayhello.sh:

.
??? Dockerfile
??? sayhello.sh
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM alpine
COPY sayhello.sh sayhello.sh
CMD ["sayhello.sh"]
Run Code Online (Sandbox Code Playgroud)

并且sayhello.sh包含简单

echo hello
Run Code Online (Sandbox Code Playgroud)

Dockerfile成功生成:

kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker build --tag trybash .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM alpine
 ---> 665ffb03bfae
Step 2/3 : COPY sayhello.sh sayhello.sh
 ---> Using cache
 ---> fe41f2497715
Step 3/3 : CMD sayhello.sh
 ---> Using cache
 ---> dfcc26c78541
Successfully built dfcc26c78541
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试run它,我会收到一个executable file not found in $PATH错误:

kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker run trybash
container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH"
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH".
ERRO[0001] error getting events from daemon: net/http: request canceled
Run Code Online (Sandbox Code Playgroud)

有人可以解释是什么原因造成的吗?(我记得debian:jessie以类似的方式在基于图像的图像中运行脚本,所以也许它是特定于Alpine的)?

use*_*097 50

Alpine带有/ bin/sh作为默认shell而不是/ bin/bash

所以你可以

1)你的sayhello.sh的第一行是一个shebang定义/ bin/sh,所以你的文件sayhello.sh将以

bash

2)在您的Alpine图像中安装bash,因为您似乎期望bash存在,在Dockerfile中有这样一行

bash

  • 我需要将 `#!/bin/ash` 添加到脚本顶部才能正确解释 (2认同)

aer*_*ite 16

这个答案完全正确,工作正常.

还有另一种方法,你可以在基于alpine的docker中运行bash脚本

您需要像下面那样更改CMD

CMD ["sh", "sayhello.sh"]
Run Code Online (Sandbox Code Playgroud)

这也有效.

  • 尽管这可能有效,但 bash 脚本与 sh 脚本的 API 并不 100% 兼容。我相信 sh 代表 shell,而 Bash 代表 Bourne Again SHell。https://www.gnu.org/software/bash/manual/html_node/What-is-Bash_003f.html#What-is-Bash_003f 因此,未来的访问者知道它们确实是不同的 shell。 (5认同)

小智 7

请记住为所有脚本授予执行权限.

FROM alpine
COPY sayhello.sh /sayhello.sh
RUN chmod +x /sayhello.sh
CMD ["/sayhello.sh"]
Run Code Online (Sandbox Code Playgroud)

  • 如果Dockerfile中已有权限,则不需要授予执行权限 (4认同)

zig*_*arn 5

通过使用CMD,码头工人正在搜索sayhello.sh的文件PATH,但你复制它/是不是在PATH

因此,使用您要执行的脚本的绝对路径:

CMD ["/sayhello.sh"]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,正如@user2915097 所说,小心 Alpine 默认没有 Bash,以防您的脚本在 shebang 中使用它。