Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用bash脚本自动将密码短语输入docker容器?_Php_Bash_Docker_Ssh_Passphrase - Fatal编程技术网

Php 如何使用bash脚本自动将密码短语输入docker容器?

Php 如何使用bash脚本自动将密码短语输入docker容器?,php,bash,docker,ssh,passphrase,Php,Bash,Docker,Ssh,Passphrase,我需要知道如何在docker容器中为私钥自动输入密码短语 我在使用docker设置web应用程序容器时遇到问题。在安装过程中,我必须在容器中运行composer install,并且存在一个需要克隆私有git存储库的依赖项。在这种情况下,它需要使用我的私钥,并且密钥由密码短语保护。因此,在运行composer install时,需要提供密码短语来克隆存储库。当我在容器中手动运行这些命令时,该流没有问题 但我计划用bash脚本自动化整个过程,当我在主机内运行bash脚本时,它不会要求密码短语并以“

我需要知道如何在docker容器中为私钥自动输入密码短语

我在使用docker设置web应用程序容器时遇到问题。在安装过程中,我必须在容器中运行
composer install
,并且存在一个需要克隆私有git存储库的依赖项。在这种情况下,它需要使用我的私钥,并且密钥由密码短语保护。因此,在运行
composer install
时,需要提供密码短语来克隆存储库。当我在容器中手动运行这些命令时,该流没有问题

但我计划用bash脚本自动化整个过程,当我在主机内运行bash脚本时,它不会要求密码短语并以“Permission denied(publickey)”错误退出


如何在不退出脚本的情况下使用bash脚本自动化整个过程?我正在搜索一种类似的方法,即在克隆私有存储库或任何其他工作解决方案时提示输入密码短语。

您可以使用机密来管理容器在运行时需要的任何敏感数据,但您不希望将其存储在映像或源代码管理中

注意:Docker机密仅适用于swarm服务,不适用于独立容器。若要使用此特性,请考虑将容器作为服务运行。有状态容器通常可以以1的比例运行,而无需更改容器代码


选中

您可以使用机密来管理容器在运行时需要的任何敏感数据,但您不希望将其存储在映像或源代码管理中

注意:Docker机密仅适用于swarm服务,不适用于独立容器。若要使用此特性,请考虑将容器作为服务运行。有状态容器通常可以以1的比例运行,而无需更改容器代码

勾选通常答案是“不要”。在构建期间输入的密码将是图像的一部分,通常在层历史记录中。如果您不介意在映像中包含密码,那么它取决于正在运行的命令。有时您可以
echo p4ssw0rd | git clone…
,但有时该命令会故意删除管道输入并强制提示安全性。其他命令具有选项,可在命令提示符上包含带有标志的密码。有些人会使用一个“expect”脚本来处理这样的提示,该脚本监视输出并在提示时发送密码。每一个都会将密码放入图像中

对于您的特定场景,一个选项是添加一个不需要git密码的密钥对。另一种选择是在docker构建之外签出代码,并将repo复制到映像中,而不是让git签出

如果您确实需要在映像中包含密码,那么请查看多阶段构建。在第一阶段输入密码,然后将结果复制到第二阶段,这样您推送的图像不会在图像层中包含密码。

通常答案是“不要”。在构建期间输入的密码将是图像的一部分,通常在层历史记录中。如果您不介意在映像中包含密码,那么它取决于正在运行的命令。有时您可以
echo p4ssw0rd | git clone…
,但有时该命令会故意删除管道输入并强制提示安全性。其他命令具有选项,可在命令提示符上包含带有标志的密码。有些人会使用一个“expect”脚本来处理这样的提示,该脚本监视输出并在提示时发送密码。每一个都会将密码放入图像中

对于您的特定场景,一个选项是添加一个不需要git密码的密钥对。另一种选择是在docker构建之外签出代码,并将repo复制到映像中,而不是让git签出


如果您确实需要在映像中包含密码,那么请查看多阶段构建。在第一阶段输入密码,然后将结果复制到第二阶段,这样您推送的图像就不会在图像层中包含密码。

我找到了问题的答案,它非常简单,只需在调用
composer install
的bash脚本中将
-it
标志设置为
docker exec
命令。我故意跳过了这个标志,因为它在bash脚本中运行,我没有注意到需要一个交互模式来提示输入
密码短语

无论如何,在像下面这样修改bash脚本之后,问题就解决了

docker exec -it {container_name} composer install
在看了以上的答案后,我觉得我还没有给出关于这个问题的完整情况。所以我想,我需要在这里补充一些解释。bash脚本的结构如下所示

  • 使用docker compose启动容器
    在本例中,我的应用程序代码作为
    docker卷放置在web app容器之外,以便轻松管理
  • 使用上面的
    docker exec
    命令将PHP依赖项安装到web应用程序容器中
  • 使用再次相关的
    docker exec
    命令运行数据库迁移
  • 所以,我的问题是安装composer软件包时的第二步。在
    composer安装期间,有一个包需要从私有git存储库克隆。对于要克隆的密钥,将使用我的私钥,因为它受
    密码短语的保护,并且缺少
    docker exec
    命令交互模式所需的标志(
    -it
    ),所以bash脚本