【问题标题】:docker-entrypoint best practice for script executiondocker-entrypoint 脚本执行的最佳实践
【发布时间】:2018-08-31 06:41:32
【问题描述】:

我想在我的 docker-entrypoint.sh 上运行几个脚本;

我的问题是它是否有任何区别,如果有,推荐的解决方法是什么,关于以下选项:

一个

${HOMEDIR}/myscript --param1 --param2

B

bash -c "${HOMEDIR}/myscript --param1 --param2"

C

source ${HOMEDIR}/myscript --param1 --param2

【问题讨论】:

    标签: bash docker docker-entrypoint


    【解决方案1】:

    这实际上取决于你在做什么以及你想做什么。

    ${HOMEDIR}/myscript --param1 --param2
    

    这将执行脚本。脚本完成后,它对环境所做的任何更改都将被丢弃。

    bash -c "${HOMEDIR}/myscript --param1 --param2"
    

    运行bash -c "my command here" 与仅运行my command here 的主要区别在于前者启动一个子shell,后者在当前shell 中运行命令。

    但是效果有很多不同:

    • 在子 shell 中对环境所做的更改不会影响 父外壳(当前目录,环境变量的值, 函数定义等)

    • 在父 shell 中设置的变量 未导出的将在子shell中不可用。

    Here 是我的参考,因为我对bash -c 了解不多

    source ${HOMEDIR}/myscript --param1 --param2
    

    当您调用 source(或其别名 .)时,您将脚本插入到当前 bash 进程中。所以你可以读取脚本设置的变量。

    当你调用 sh 时,你启动了一个 fork(子进程),它运行一个新的 /bin/sh 会话,这通常是一个到 bash 的符号链接。在这种情况下,子脚本设置的环境变量将在子脚本完成时被删除。

    还有here我的参考。

    TL;DR:如果您不希望 bash 保留您将要运行的脚本所做的更改,我建议您使用 (A)。如果您希望 bash 保留变量和更改,请使用 (C)。如果您想保留更改并让 bash 在另一个 bash 上运行脚本,请使用 (B),因为我列出了它们之间的差异。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2018-04-10
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多