【问题标题】:How to use a bash script in Alpine Linux?如何在 Alpine Linux 中使用 bash 脚本?
【发布时间】:2017-10-09 00:21:22
【问题描述】:

我有兴趣使用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的可执行文件是什么?看它的第一行。 #!/bin/bash 还是 sh?
  • 您的 shell 脚本似乎包含错误。请粘贴脚本

标签: linux bash docker alpine


【解决方案1】:

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

但是,我可以建议避免像这样的“黑客”并改用HEALTHCHECK吗?

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

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

  other_service
  depends_on:
    my_service:
      condition: service_healthy

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

【讨论】:

  • 确实我后来找到了wait-for,它是基于wait-for-it,但符合alpine。至于HEALTHCHECK,从文档中我可以看出它在容器启动后运行 interval 秒,然后在每次之前的检查完成后再次运行 interval 秒。但是,在我的情况下,我想在运行实际应用程序之前只运行一次检查,然后阻塞直到它通过。
  • 正如您在 docker compose v3 中看到的,不再支持 depends_ondocs.docker.com/compose/compose-file/#depends_on " - depends_on 不会等待 dbredis 在开始之前“准备好” web - 仅在它们启动之前。如果您需要等待服务准备好,请参阅控制启动顺序以获取有关此问题和解决策略的更多信息。-版本 3 不再支持 condition 形式depends_on. - 使用版本 3 Compose 文件以 swarm 模式部署堆栈时忽略 depends_on 选项。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 2018-11-28
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2015-08-07
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多