【问题标题】:Populating variable in a script other than by means of env var在脚本中填充变量而不是通过 env var
【发布时间】:2021-04-29 10:42:18
【问题描述】:

请注意:尽管这个问题提到 MySQL 和 Docker,但实际上两者都没有任何关系,任何知识渊博的 bash 脚本编写者都应该能够回答。


我的 bash 脚本在这里生锈。我正在查看官方的MySQL 8.0 Dockerfile,发现它调用并运行了一个名为docker-entrypoint.sh 的bash 脚本。查看该脚本,它似乎(有条件地)运行snippet of code that creates a database,如果它尚不存在:

if [ "$MYSQL_DATABASE" ]; then
  echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
  mysql+=( "$MYSQL_DATABASE" )
fi

我想知道该脚本期望从哪里填充 MYSQL_DATABASE 变量。如果它期望MYSQL_DATABASE 是一个可选的环境变量,我会期望(从我公认的生疏回忆中)if 条件看起来像:

if [ -z "$MYSQL_DATABASE" ]; then
  ...
fi

我想 可能 MYSQL_DATABASE 应该是脚本的运行时参数,但我倾向于将其作为一个可行的选项,因为 Dockerfile 没有传递任何脚本调用的参数。

谁能帮助我了解如何使用数据库名称(例如“my_db”)填充MYSQL_DATABASE,以便在此脚本运行时为我创建数据库?

【问题讨论】:

  • if 条件如果是环境变量或脚本中定义的变量有什么区别,我的意思是如果此检查适用于脚本中定义的变量,为什么它不适用于环境变量?
  • 谢谢@Shmuel (+1) 但我不明白你想说什么。我在这里问的问题是:如何在运行时/调用时从脚本外部填充MYSQL_DATABASE
  • @hotmeatballsoup :如果一个变量在使用之前没有在脚本中明确设置,并且应该包含一个值,那么它必须是一个环境变量。当然,作为脚本作者,您也可以决定通过参数列表或参数文件将信息传递给脚本……这取决于您。

标签: bash docker environment-variables dockerfile


【解决方案1】:

就shell脚本而言,环境变量只是一个碰巧从环境中继承而来的变量,它不会改变该变量的行为

所以要了解代码的作用,您不需要知道它是哪个“类型”的变量,只需要知道代码中的那个点,可能有一个带有那个的变量姓名。然后你需要知道[(又名test)命令的这个事实:

STRING:相当于-n STRING

-n STRINGSTRING的长度不为零

所以所有[ "$MYSQL_DATABASE" ] 的意思是“代码中此时$MYSQL_DATABASE 变量的长度是否大于零?”

这个变量是在脚本运行“之前”预期的(例如预设为环境变量)还是在脚本“内部”计算出来的,你只能通过阅读来了解。

【讨论】:

  • 感谢@IMSoP (+1) 所以它听起来就像你说我可以通过运行./docker-entrypoint.sh --MYSQL_DATABASE=my_db来设置该变量?
  • 不,这不是选项。您可以通过前缀命令将变量注入到命令的环境中,不过:MYSQL_DATABASE=mydn ./docker-entrypoint.sh.
  • 啊,谢谢@chepner (+1) 我假设如果我想将MYSQL_DATABASE=mydn 存储在一个文件中,我只需要在运行./docker-entrypoint.sh 之前source 文件,对吗?
  • 是的,但您还需要确保实际导出了变量:export MYSQL_DATABASE=mydn
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2019-10-20
  • 2023-04-03
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多