【问题标题】:How to run a bash script that takes multiple user intactive inputs , as part of dockerfile如何运行一个接受多个用户完整输入的 bash 脚本,作为 dockerfile 的一部分
【发布时间】:2021-12-28 04:00:25
【问题描述】:

我有以下 dockerfile 需要运行 owasp bash 文件以进行安装。 此 .sh 文件需要用户多次输入(如 1、Y、回车)才能完成安装。

如何从 dockerfile 提供这些输入,或者有没有办法跳过这些输入并继续安装。

这个 dockerfile 是 docker-compose 的一部分。

下面是 dockerfile

FROM ubuntu:20.04

RUN apt-get update && apt-get upgrade -y && apt-get clean
RUN apt-get install python3-pip -y
RUN apt-get install vim -y

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Indian

# Install OpenJDK-8
RUN apt-get install -y openjdk-8-jdk && \
    apt-get install -y ant && \
    apt-get clean;

# Fix certificate issues
RUN apt-get update && \
    apt-get install ca-certificates-java && \
    apt-get clean && \
    update-ca-certificates -f

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

RUN apt-get install wget -y && \
    apt-get install unzip -y && \
    apt-get install zip -y

RUN mkdir /home/owasp

RUN wget -c https://github.com/zaproxy/zaproxy/releases/download/v2.11.0/ZAP_2_11_0_unix.sh -P /home/owasp

RUN chmod u+x /home/owasp/ZAP_2_11_0_unix.sh
RUN ./home/owasp/ZAP_2_11_0_unix.sh

【问题讨论】:

  • 您可以修改脚本以不需要交互式输入,或者以某种方式通过非交互式配置文件传递其设置吗?或者,使用prebuilt ZAP images之一?

标签: docker ubuntu docker-compose dockerfile zap


【解决方案1】:

我建议添加一个ENTRYPOINT,这样默认情况下它会调用您的 bash 脚本,但它可以灵活地让最终用户传递不同的参数。请参阅official docs。请记住,Dockerfile 中提供的CMDdefault command。您可以通过传递任何其他值来覆盖它。

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Indian

RUN apt-get update && apt-get upgrade -y && apt-get clean
RUN apt-get install python3-pip -y
RUN apt-get install vim -y

# Install OpenJDK-8
RUN apt-get install -y openjdk-8-jdk && \
    apt-get install -y ant && \
    apt-get clean;

# Fix certificate issues
RUN apt-get update && \
    apt-get install ca-certificates-java && \
    apt-get clean && \
    update-ca-certificates -f

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

RUN apt-get install wget -y && \
    apt-get install unzip -y && \
    apt-get install zip -y

RUN mkdir /home/owasp

RUN wget -c https://github.com/zaproxy/zaproxy/releases/download/v2.11.0/ZAP_2_11_0_unix.sh -P /home/owasp

RUN chmod u+x /home/owasp/ZAP_2_11_0_unix.sh

ENTRYPOINT ./home/owasp/ZAP_2_11_0_unix.sh

CMD ['--some', '--default', '--args']

您甚至可以选择在构建时传递默认标志。因此,您的脚本将始终使用您在 docker build --build-args DEFAULT_PARAMS=--foo 上提供的默认标志运行,除非您覆盖它:

ARGS DEFAULT_PARAMS

FROM ubuntu:20.04

ENV DEFAULT_PARAMS=${DEFAULT_PARAMS}
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Indian

RUN apt-get update && apt-get upgrade -y && apt-get clean
RUN apt-get install python3-pip -y
RUN apt-get install vim -y

# Install OpenJDK-8
RUN apt-get install -y openjdk-8-jdk && \
    apt-get install -y ant && \
    apt-get clean;

# Fix certificate issues
RUN apt-get update && \
    apt-get install ca-certificates-java && \
    apt-get clean && \
    update-ca-certificates -f

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

RUN apt-get install wget -y && \
    apt-get install unzip -y && \
    apt-get install zip -y

RUN mkdir /home/owasp

RUN wget -c https://github.com/zaproxy/zaproxy/releases/download/v2.11.0/ZAP_2_11_0_unix.sh -P /home/owasp

RUN chmod u+x /home/owasp/ZAP_2_11_0_unix.sh

ENTRYPOINT ./home/owasp/ZAP_2_11_0_unix.sh

CMD ${DEFAULT_PARAMS}

【讨论】:

  • 实际上脚本的输入是连续的,一个接一个,就像条款和条件一样,所以它不仅仅是一组输入...它就像脚本运行,要求输入并继续安装,然后再次继续安装,然后再次要求用户输入。通过您的示例,我理解的是,使用一组输入运行脚本
  • 是自定义脚本吗?您可以通过以下方式强制 Ubuntu 成为非输入设备:ENV DEBIAN_FRONTEND=noninteractive 而不是 ARG DEBIAN_FRONTEND=noninteractive。
  • 不,它不是自定义脚本。它是安装应用程序的安装脚本
  • 尝试在你的 Dockerfile 顶部设置 ENV DEBIAN_FRONTEND=noninteractive,就在 FROM ubuntu:20.04 下。这会强制 ubuntu 禁用交互模式。
【解决方案2】:

要为命令提供输入,请使用一些输入生成器并将其与您的命令一起传递。

典型示例是使用命令yes,它在输出中提供无穷无尽的“y”流:

RUN yes|./own-shell-scrpit.sh

您可以运行printf 'y\n1abc\nxxx' 并通过管道传输它。 printf 中的“\n”表示换行符(或回车)。

【讨论】:

  • 输入流不同,从 Enter 开始,然后是 1,1,1,..thenY,Y...同样
  • 答案的哪一部分你不明白?
  • 非常感谢。有效。我必须结合输入和 Enter (1\n)
【解决方案3】:

使用 Linux 软件包:https://github.com/zaproxy/zaproxy/releases/download/v2.11.0/ZAP_2.11.0_Linux.tar.gz 这具有相同的内容,但只是一个 gzip 压缩的 tar 文件:) 可用 ZAP 下载的完整列表位于 https://www.zaproxy.org/download/

或者您可以随时扩展我们的 docker 镜像https://www.zaproxy.org/docs/docker/

【讨论】:

  • 感谢西蒙的回复。我知道 docker 映像,但需要将其安装在 ubuntu 机器上。
最近更新 更多