【问题标题】:Pass arguments from file to a script run from dockerfile将参数从文件传递到从 dockerfile 运行的脚本
【发布时间】:2018-09-22 21:18:06
【问题描述】:

在我的Dockerfile 中,我想运行一个命令来执行一个 bash 脚本,该脚本获取从文件中读取的传递参数。

plugins.txt 中指定了一个插件(完整文件内容:configuration-as-code),但 bash 脚本根本没有收到任何参数。

但由于我发现了如何在 blog post 上安装插件的这种方式,我认为它应该按原样工作。

COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
COPY install-plugins.sh /usr/local/bin/install-plugins.sh
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

安装程序脚本以以下行开头并以 Usage /usr/local/bin/install-plugins.sh plugin1 plugin 2 ... 退出

#!/bin/bash 

set -e

if [ $# -eq 0 ]; then
  echo "USAGE: $0 plugin1 plugin2 ..."
  exit 1
fi

如何正确地将文件plugins.txt 的内容传递给脚本?

编辑

我找到了正确传递参数的解决方案。有人知道为什么最初的尝试是错误的吗?

它适用于:

RUN /usr/local/bin/install-plugins.sh $(cat /usr/share/jenkins/ref/plugins.txt)

【问题讨论】:

    标签: bash ubuntu dockerfile


    【解决方案1】:

    问题在于 I/O 重定向不是脚本的参数。

    我们可以使用tty 命令来检查脚本是否使用I/O 重定向来读取文件。

    如果脚本有 TTY,则检查参数的数量。从参数中读取插件名称。

    如果没有TTY,说明我们使用了I/O​​重定向,这种情况下不需要检查参数。通过mapfile 命令将I/O 重定向中的插件名称读入数组变量plugins

    #!/usr/bin/env bash
    set -eu
    
    if tty &>/dev/null && [ "$#" -eq 0 ]; then
      echo "USAGE: $0 plugin1 plugin2 ..."
      exit 1
    fi
    
    if tty &>/dev/null; then
      plugins=("$@")
    else
      mapfile -t plugins
    fi
    
    for plugin in "${plugins[@]}"; do
      echo install_plugin "$plugin"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      相关资源
      最近更新 更多