当前位置: 首页 > 知识库问答 >
问题:

如何将本地机器的SSH密钥传递给docker容器?

令狐献
2023-03-14

我正在尝试从Dockerfile构建一个docker镜像,需要采取的步骤之一是安装一个依赖项,该依赖项只能通过私有Gitlab存储库获得。这意味着容器需要访问SSH密钥才能进行克隆。我知道这不是最安全的方法,但这只是一个中间容器,一旦运行应用程序所需的所有组件都到位,它将被移除。

问题是,无论我怎么尝试,我都无法让docker中的ssh代理建立连接。我得到:

npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

如果我尝试简单地克隆存储库而不运行npm install,也会发生同样的事情。这是我使用的Dockerfile:

FROM risingstack/alpine:3.4-v6.9.4-4.2.0


RUN apk update

RUN apk add openssh

ARG SSH_KEY

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 700 /root/.ssh && \
    ssh-keyscan github.com > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod 700 /root/.ssh/id_rsa && \


RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa && ssh -o StrictHostKeyChecking=no git@github.com || true && npm install

和命令(我将私钥作为构建参数传递):

docker build -t test  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" .

共有3个答案

宋安晏
2023-03-14

从 Dockerfile 构建一个 Docker 镜像,需要采取的步骤之一是安装一个只能通过私有 Gitlab 存储库获得的依赖项

就像我在关于如何在构建期间将主机卷挂载到dockerfile中的Docker容器的回答中更详细描述的那样,Docker还提供SSH代理转发。这将在< code>docker build命令中使用< code> - ssh标志,并在任何Dockerfile的< code>RUN命令中使用< code> - mount=type=ssh,以便将ssh验证委托给主机上的代理。

胡璞瑜
2023-03-14

在运行< code>docker build之前,我会使用已经运行的ssh-agent在主机上克隆它。

如果你真的必须在图像中拥有私钥(你已经承认这是危险的),那么你应该能够把它放在它的默认位置,$HOME/.ssh/id_rsa你在代码中的位置;不要尝试启动 ssh 代理。如果您的问题是主动主机密钥检查,您也可以注入$HOME/.ssh/config 文件,或者注入已具有主机密钥的 $HOME/.ssh/known_hosts 文件。由于所有这些文件都是文件,您可能会发现将它们放在 Docker 构建树中并将它们复制到 $HOME/.ssh 中会更容易。

段渊
2023-03-14

这对我有用:

使用此解决方法:https://stackoverflow.com/a/47544999/3957754将文件作为构建参数传递

泊坞文件

ARG SSH_KEY
ENV SSH_KEY=$SSH_KEY

# Make ssh dir
RUN mkdir /root/.ssh/
 
# Create id_rsa from string arg, and set permissions

RUN echo "$SSH_KEY" > /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
 
# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Add git providers to known_hosts
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
RUN ssh-keyscan gitlab.com >> /root/.ssh/known_hosts

docker build -t some-app --build-arg SSH_KEY="$(cat ~/file/outside/build/context/id_rsa)" .

这样,您就可以执行git克隆git@github.com了...(gitlab或bitbucket)在构建阶段或运行阶段使用< code > entry point[" docker-entry point . sh "]。

如果您需要将任何文件作为参数传递给容器,则可以这样做

安全性

正如评论者所说,在构建时将文件传递给容器是不安全的。解决方法和最佳实践是:在c.i (jenkins、bamboo、circleci等)中克隆项目,并执行< code>docker构建...。在docker内部克隆项目通常只是为了旧的所需库,而不是为了主要的源代码

 类似资料:
  • 我在Mac OS X上使用Docker机器(使用默认的boot2docker机器),并且我使用docker-compose来设置我的开发环境。

  • 问题内容: 我是Docker的新手,目前尚不清楚如何从容器访问外部数据库。硬编码连接字符串的最佳方法是吗? 问题答案: 您可以使用该标志将环境变量传递到您的容器。 启动脚本的示例: 或者,如果您不希望在命令行中使用,等显示该值,则可以直接从当前环境中获取该值,如果您不带: 如果您有许多环境变量,尤其是要保密的话,可以使用env文件: --env-file标志将文件名作为参数,并期望每行采用VAR

  • 我是Docker的新手,不清楚如何从容器访问外部数据库。是在连接字符串中硬编码的最佳方法吗?

  • 问题内容: 我有一个应用程序可以使用Git执行各种有趣的操作(例如运行git clone和git push),而我正在尝试对其进行docker-ize。 我遇到了一个问题,尽管我需要能够向容器中添加SSH密钥以供容器“用户”使用。 我尝试将其复制到,进行更改,创建了一个git ssh包装器,但还是没有运气。 这是Dockerfile供参考: 运行git命令,如 问题答案: 原来使用Ubuntu时,

  • 我是第一次和docker合作,我正在努力弄清楚这一切。 在我正在进行的这个项目中,我们在启动文件中广泛使用了Windows环境变量。为了将这些内容放入配置中,我们使用AddEnvironmentVariables(string prefix)方法,如下所示: 在localhost和Azure中,这是没有问题的,因为我们已经将它们添加到了这些环境中。但是我不能想出如何在我的docker容器中配置这些

  • 问题内容: 我正在运行容器 hypriot / rpi-busybox-httpd 我正在尝试SSH到docker容器:但它给出了错误: 我马上就做吗? 问题答案: 可能是您的映像未安装二进制/ bin / bash(如之前所建议),我遇到了同样的问题,因此我可以使用/ bin / sh进入容器 另一个解决方法是直接执行命令,而无需访问任何shell。