【问题标题】:How to automate of entering pass-phrases into docker containers with bash scripts?如何使用 bash 脚本自动将密码短语输入到 docker 容器中?
【发布时间】:2019-01-11 09:52:29
【问题描述】:

我需要知道如何在 docker 容器中自动执行为私钥输入密码的过程。

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

但我打算使用 bash 脚本自动化整个过程,当我在主机中运行我的 bash 脚本时,它不会要求输入密码并以“Permission denied (publickey)”错误退出.

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

【问题讨论】:

    标签: php bash docker ssh passphrase


    【解决方案1】:

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

    注意:Docker 机密仅适用于 swarm 服务,不适用于独立容器。要使用此功能,请考虑调整您的容器以作为服务运行。有状态容器通常可以在不更改容器代码的情况下以 1 的比例运行。

    查看https://docs.docker.com/engine/swarm/secrets/#how-docker-manages-secrets

    【讨论】:

      【解决方案2】:

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

      对于您的特定情况,一种选择是添加一个不需要密码的密钥对 git。另一种选择是在 docker 构建之外签出代码,并将COPY 回购到映像中,而不是让 git 签出。

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

      【讨论】:

        【解决方案3】:

        我找到了问题的答案,只需在调用composer install 的bash 脚本中将-it 标志设置为docker exec 命令即可。我故意跳过了该标志,因为它在 bash 脚本中运行,我没有注意到需要交互模式来提示 pass-phrase

        无论如何,修改如下的 bash 脚本后,问题就解决了。

        docker exec -it {container_name} composer install
        

        看了上面的答案后,我觉得我还没有给出关于这个问题的全貌。所以我想,我需要在这里添加一些解释。 bash脚本的结构如下;

        1. 使用 docker-compose 启动容器
          在这种情况下,我的应用程序代码作为 docker volume 放置在 Web 应用程序容器之外,以便能够轻松管理。
        2. 使用上述docker exec 命令将PHP 依赖项安装到Web 应用容器中
        3. 再次使用相关的docker exec 命令运行数据库迁移

        所以,我的问题在于安装作曲家包时的第二步。在composer install 期间,有一个包需要从私有 git 存储库中克隆。为了被克隆,我使用了我的私钥,因为它受到pass-phrase 的保护并且缺少docker exec 命令的交互模式所需的标志(-it),bash 脚本退出并出现错误.设置 -it 标志后,现在问题已修复。

        【讨论】:

          最近更新 更多