如何在 Alpine Linux 中使用 bash 脚本?

How to use a bash script in Alpine Linux?

我有兴趣使用 wait-for-it 在 Docker 中制作一项服务-Compose 等待另一个,使用基于 Alpine Linux 分布的图像。

但是,如果我克隆 wait-for-it 存储库并向其中添加以下内容 Dockerfile

FROM alpine
RUN apk --update add bash
COPY wait-for-it.sh wait-for-it.sh
CMD ["./wait-for-it.sh", "www.google.com:80"]

然后我使用 docker build --tag waitforit .docker run waitforit 构建它,但我收到此错误消息:

timeout: can't execute '15': No such file or directory
wait-for-it.sh: timeout occurred after waiting 15 seconds for www.google.com:80

相比之下,这是我在 运行 我的 (Ubuntu 16.04 LTS) 计算机上执行此命令时看到的:

wait-for-it.sh: waiting 15 seconds for www.google.com:80
wait-for-it.sh: www.google.com:80 is available after 0 seconds

似乎 bash 脚本在 Alpine 容器中无法运行,因为它在我的 Ubuntu 本地计算机上运行。我该如何解决这个问题?

wait-for-it 脚本不兼容 sh,因此您需要将 bash 安装到您的 alpine 映像中。

但是,我是否可以建议避免这样 "hacks" 而使用 HEALTHCHECK

例如,让一项服务等待另一项服务正常运行看起来像这样:

services:
  my_service:
    image: something
    healthcheck:
      test: nc -z 3306

  other_service
  depends_on:
    my_service:
      condition: service_healthy

请注意,这仅适用于 v2 撰写文件,不适用于 v3

如果你像我一样来到这里寻找 Alpine 中 "No such file or directory" 错误 运行 脚本的解决方案,另一件要检查的事情是你的脚本有 unix 行结尾。

在我的例子中,我将脚本保存在 windows 中并将其添加到 docker 图像中,它给出了同样无用的错误消息。