【问题标题】:How to fix "Illegal option" error when compiling a dockerfile?编译 dockerfile 时如何修复“非法选项”错误?
【发布时间】:2021-11-02 10:26:49
【问题描述】:

我在dockerfile中有一个应用,需要调用.sh文件来下载包,但是调用这个文件时总是报错。 p>

我的 dockerfile 是:

FROM alpine:3.12 as builder

ARG VERSION=7.16.0
ARG DISTRO=tomcat
ARG SNAPSHOT=true

ARG JMX_PROMETHEUS_VERSION=0.12.0

RUN apk add --no-cache \
        bash \
        ca-certificates \
        maven \
        tar \
        wget \
        xmlstarlet

COPY settings.xml download.sh camunda-run.sh camunda-tomcat.sh camunda-wildfly.sh  /tmp/

RUN /tmp/download.sh

FROM alpine:3.12

RUN apk add --no-cache \
        bash \
        ca-certificates \
        curl \
        openjdk11-jre-headless \
        tzdata \
        tini \
        xmlstarlet \
    && curl -o /usr/local/bin/wait-for-it.sh \
      "https://raw.githubusercontent.com/vishnubob/wait-for-it/a454892f3c2ebbc22bd15e446415b8fcb7c1cfa4/wait-for-it.sh" \
    && chmod +x /usr/local/bin/wait-for-it.sh

RUN addgroup -g 1000 -S camunda && \
    adduser -u 1000 -S camunda -G camunda -h /camunda -s /bin/bash -D camunda
WORKDIR /camunda
USER camunda

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["./camunda.sh"]

COPY --chown=camunda:camunda --from=builder /camunda .

我的 download.sh 文件看起来就像这样:https://github.com/camunda/docker-camunda-bpm-platform/blob/next/download.sh

运行命令时:docker build . -t servicecamundadocker/latest 我得到错误:

 => ERROR [builder 4/4] RUN /tmp/download.sh                                                                                       0.2s ------
 > [builder 4/4] RUN /tmp/download.sh:
#11 0.216 /bin/sh: illegal option -
------

有谁知道如何解决这个错误?谢谢

【问题讨论】:

  • alpine 的默认 shell 是 ash(尽管 /bin/sh 可能是它的别名)所以可能不支持该脚本中使用的 -ex ... 你能尝试执行吗该脚本在交互式纯高山容器中?
  • 可以添加download.sh脚本内容吗?
  • @Noam Yizraeli 完成!
  • 在您的脚本中,您以/bin/sh -ex 开头,-e 在不处于交互模式时退出(文档中说 - If not interactive, exit immediately if any untested command fails)您可以将其删除并重试吗?

标签: docker dockerfile docker-build


【解决方案1】:

经过大量研究,我找到了解决方案。

问题是 Windows 使用 \r\n 作为行尾,而 unix 只使用 \n。因此,在我的 download.sh 文件中,有一个 ^M 字符导致错误 /bin/sh: 非法选项

解决办法是从downlod.sh文件中复制代码,并转换成LF

  • 在Windows机器上使用Notepad++等文本编辑器进行转换
    • 转到菜单编辑 -> EOL 转换 -> Unix (LF)

一旦完成,docker build 就可以正常工作了。

感谢大家的支持。

【讨论】:

  • 对于那些 vi/vim 使用 :set ff=unix.
  • 谢谢你,好先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2020-03-06
  • 1970-01-01
  • 2018-09-03
  • 2014-12-05
相关资源
最近更新 更多