将parameter passing给另一个进程,因为它们是通过bash脚本在命令行中input的

不知道我把这个称为好,因为我无法find答案,我很高兴使用类似的术语,但在这里。

这就是情况,我们在Docker容器中运行一些服务,它们都在各自的VLAN中。 Docker方便地为各个容器添加条目,以便应用程序可以从其容器名称中parsing其他地址。 例如我有一个名为应用程序的容器和一个名为devsql的容器,运行一个mysql服务器。 如果我使用exec从应用程序容器中运行ping devsql ,则会解决问题并对其进行处理。 但是,如果我从主机运行ping devsql ,它不知道是什么。

我们的应用程序是一个laravel应用程序,我们编写迁移,然后我们使用“工匠”脚本来执行。 通常,这看起来像php artisan migrate 。 但是,configuration使用devsql作为mysql服务器的地址,这对容器来说很好,但是主机无法解决这个问题,所以迁移会抛出一个错误。

我们的解决scheme是从vlan上的一个实用程序容器中运行它,所以相应的命令是docker run -it --rm --network=environment_network -v /var/www/html/whatever:/whatever util -c "cd /whatever && php artisan migrate"显然,这是最好的麻烦,最坏的情况是混淆新员工的一件事。 所以我想把它包装在一个脚本中。

我希望脚本能像正在运行常规php一样工作。 对于上面的例子,这很容易,但我想它来处理例如php -r "echo 'lol'"; 。 我不希望用户必须知道他们需要考虑多次扩展。 我有一个脚本,但我不知道它是多么脆弱,我想知道是否有更好的方法来实现这一点:

 #!/bin/bash # echo "cd /pwd && php $@" # Assume that any argument with spaces in it was quoted (really not sure how great an assumption this # is, but it's worked well in test). Bash already expanded the string when parsing the command to call # this script, but we want this to be a seamless experience for the user and they shouldn't have to know # that it will be expanded twice, so we need to put quotes back around it. Since we don't want to # expand it here either, we surround it with single quotes to pass it to the docker container without # expansion x=() for i in "$@" do if [[ $i =~ [[:space:]] ]] then x+=\'$i\'' ' else x+=$i' ' fi done #echo "cd /pwd && php $x" docker run -it --rm --network=environment_network -v $PWD:/pwd util -c "cd /pwd && php $x" 

我只是得到了一个强大的代码味道的假设,它感觉像一个黑客,并且必须有一个更好,更强大的方式来实现这一点。 或者我的假设很差,而我没有想到的东西会打破它。

我想我的问题是,是否有一个内置的构造,以我想要的方式来传递参数? 还是你看到我的假设明显的缺陷?

使用-w选项来改变工作目录,为命令( php )使用单独的参数,并删除所有引用的魔法:

 docker run -it [other docker options] -w /pwd util php "$@" 

这意味着图像中没有ENTRYPOINT(或者ENTRYPOINT可以处理所有这些参数)。 否则,使用--entrypoint /path/to/php而不是指定php作为命令。