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

如何在Alpine Linux中使用bash脚本?,linux,bash,docker,alpine,Linux,Bash,Docker,Alpine,我对使用基于Alpine Linux发行版的图像使Docker Compose中的一个服务等待另一个服务感兴趣 但是,如果我克隆等待它存储库并向其中添加以下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构建它。后面跟着d

我对使用基于Alpine Linux发行版的图像使Docker Compose中的一个服务等待另一个服务感兴趣

但是,如果我克隆
等待它
存储库并向其中添加以下
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本地机器上。如何修复此问题?

等待它
脚本不符合sh,因此您需要将
bash
安装到您的alpine映像中

然而,我是否可以建议避免像这样的“黑客”,而是使用
HEALTHCHECK

例如,让一个服务等待另一个服务正常运行将如下所示:

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

  other_service
  depends_on:
    my_service:
      condition: service_healthy

请注意,这只适用于
v2
compose file,而不适用于
v3

如果您像我一样来到这里,寻找解决在Alpine中运行脚本时出现“没有这样的文件或目录”错误的方法,那么需要检查的另一件事是您的脚本是否有unix行结尾


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

wait-for-it.sh的可执行文件是什么?看它的第一行/bin/bash或sh?似乎您的shell脚本包含错误。请粘贴我后来找到的脚本,该脚本基于
等待它
,但符合
alpine
。至于,从我从文档中可以看出,它在容器启动后每隔几秒运行一次,然后在前一次检查完成后每隔几秒运行一次。然而,在我的情况下,我只想在运行实际应用程序之前运行一次检查,并阻止它通过。正如您在docker compose v3中所读到的那样,不再支持<代码>依赖<代码>:-<代码>依赖<代码>不等待<代码>db<代码>和<代码>redis<代码>处于“就绪”状态在启动
web
之前-仅在它们启动之前。如果您需要等待服务准备就绪,请参阅控制启动顺序以了解有关此问题的详细信息和解决策略。-版本3不再支持
依赖
条件
形式-当d时忽略
依赖
选项在swarm模式下使用版本3 Compose文件部署堆栈。