在Windows主机上,如何将SSH密钥挂载到临时容器中?

41次阅读
没有评论

问题描述

正在处理一个使用Git与一些Git仓库进行交互的容器。然而,为了使用Git,容器需要使用存储在Windows主机机器上的SSH密钥。用户尝试了两种方法,但似乎都存在问题。

  1. 用户尝试将密钥的位置挂载到/root/.ssh目录,但Git显示不安全密钥的错误。问题出在密钥的权限不是600。用户尝试运行一个入口脚本,将/root/.ssh目录中的所有文件权限更改为600,但权限似乎并没有改变,可能是因为底层文件系统是NTFS。
  2. 用户尝试将密钥的位置挂载到容器内的随机位置(例如/tmp),然后尝试使用入口脚本将/tmp目录中的内容复制到/root/.ssh,并将其权限更改为600。但是,在这种情况下,如果容器生成新的密钥,这些密钥将不会保存在主机上,在容器关闭时将丢失。

解决方案

请注意以下操作可能涉及系统权限和文件系统差异。

使用SSH代理进行密钥管理

一种更优雅的方法是,不直接将SSH密钥挂载到容器中,而是使用SSH代理进行密钥管理。这将允许容器访问主机上的SSH密钥,而不会在容器内部存储密钥。以下是如何实现的步骤:

  1. 在主机上启动SSH代理: 打开一个命令行窗口,运行以下命令来启动SSH代理:
    bash
    eval $(ssh-agent)
    ssh-add /path/to/your/private/key

    替换/path/to/your/private/key为您的私钥文件的实际路径。

  2. 将代理环境变量传递给容器: 在运行容器时,将主机上SSH代理的环境变量传递给容器。通过这种方式,容器将能够使用主机上的SSH代理来进行身份验证。

使用docker run命令运行容器,并将主机上SSH代理的环境变量传递给容器:
bash
docker run -it --rm -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK your_image

  1. 在容器内使用SSH代理: 现在,在容器内部,您可以使用SSH代理来进行Git操作,而无需将密钥直接存储在容器内。Git将使用SSH代理进行身份验证,并在主机上查找私钥。

请注意,这种方法需要将SSH代理的环境变量传递给容器。此外,要确保主机上的SSH代理在容器运行期间保持活动状态。

将SSH密钥复制到容器

如果您仍然希望将SSH密钥直接复制到容器内,您可以尝试以下步骤:

  1. 创建Dockerfile: 创建一个名为Dockerfile的文件,并使用以下内容:

Dockerfile
FROM your_base_image
COPY /path/to/your/private/key /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
# 其他Dockerfile配置

替换your_base_image为您基础的Docker镜像,/path/to/your/private/key为您的私钥文件的实际路径。

  1. 构建和运行容器: 在包含Dockerfile的目录中,运行以下命令来构建和运行容器:

bash
docker build -t your_custom_image .
docker run -it --rm your_custom_image

这将构建一个新的Docker镜像,并运行一个临时容器。

  1. 注意: 将SSH密钥复制到容器内部可能会增加安全风险。确保只在受信任的环境中执行此操作。

无论您选择哪种方法,都应该考虑安全性和最佳实践,以保护您的私钥和敏感数据。在将私钥传递给容器或挂载到容器内部时,请务必仔细考虑潜在的风险。

正文完