【问题标题】:How to prevent the `#!/bin/bash: not found` error when calling a script from Dockerfile从 Dockerfile 调用脚本时如何防止出现 `#!/bin/bash: not found` 错误
【发布时间】:2017-07-30 22:50:35
【问题描述】:

我有以下Dockerfile

FROM debian:stretch-backports

MAINTAINER c33s

ARG DEBIAN_FRONTEND=noninteractive
COPY provision-base.sh /root/provision-base.sh
RUN chmod +x /root/provision-base.sh && /root/provision-base.sh

为什么运行它会出现以下错误:

...snip...
/root/provision-base.sh: 1: /root/provision-base.sh: #!/bin/bash: not found
...snip...
  • 文件存在RUN ls /root/provision-base.sh 显示它
  • RUN which bash 也显示 bash 已安装
  • 脚本启动并在出错后继续运行
  • 构建成功

dockerhub 上的构建日志:https://hub.docker.com/r/c33s/debian/builds/bd6g8cqr2rtys9a2gguehcw/(构建日志的片段也在 pastebin https://pastebin.com/6x1UK53H

【问题讨论】:

标签: bash docker dockerfile


【解决方案1】:

Bash 通常位于不同系统的不同位置。通常在/bin/bash,但在这个容器上它位于这里:

 % docker run -it debian:stretch-backports
root@bb01a3db779e:/# type bash
bash is /usr/bin/bash

env 命令更具可预测性,可用于定位 shebang 行中的其他程序。所以在你的脚本中试试这个:

#!/usr/bin/env bash

【讨论】:

  • #!/usr/bin/bash: not found#!/usr/bin/env: not found之前都试过了
  • 你必须“钓鱼”。或者实验。我的图像,它位于“/bin/sh”。 #linuxFlavorsVary
【解决方案2】:

我现在怀疑问题出在脚本的内部文件格式上。

这可能是通过网络浏览器下载时发生的。至少这是我在 Mac OS 上通过 Chrome 下载 /debian/provision-base.sh 后得到的:

$ file *
provision-base.sh: Bourne-Again shell script text executable, UTF-8 Unicode (with BOM) text
script-with-good-format.sh:   Bourne-Again shell script text executable, ASCII

然后我在构建 Dockerfile 时出现同样的错误。

BOM 可以这样删除,应该可以解决问题:

awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' provision-base.sh > provision-base.sh

【讨论】:

  • 我的记事本++的默认设置是没有bom的utf-8,所以我不知道为什么我所有用bom编码utf8的文件都没有在那里搜索问题。我只是在记事本++中转换了它们。到没有bom的utf8。现在像魅力一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2019-09-12
  • 2018-05-24
  • 2016-01-02
  • 2023-03-07
相关资源
最近更新 更多