Docker-entrypoint脚本执行的最佳实践

3
我希望在我的docker-entrypoint.sh上运行一些脚本;
我的问题是是否有任何区别,如果有的话,关于以下选项,推荐的操作方式是什么:
A.
${HOMEDIR}/myscript --param1 --param2

B.

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

C语言

source ${HOMEDIR}/myscript --param1 --param2
1个回答

4

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

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

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

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

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

然而,它们的效果有许多不同之处:

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

  • 在父shell中设置但未导出的变量将在子shell中无法使用。

这里是我的参考资料,因为我不太了解bash -c

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

当您调用source(或其别名.)时,您将脚本插入当前bash进程中。因此,您可以读取脚本设置的变量。
当您调用sh时,您会启动一个fork(子进程),该子进程运行/bin/sh的新会话,该文件通常是指向bash的符号链接。在这种情况下,由子脚本设置的环境变量将在子脚本完成后被删除。
此外here是我的参考资料。
简而言之:如果您不希望bash保留要运行的脚本所需的更改,建议使用(A)。如果您希望bash保留变量和更改,请使用(C)。如果您想保留更改并使bash在另一个bash上运行脚本,请使用(B),因为我列出了它们之间的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接