如何将本地机器的SSH密钥传递给码头工人容器?



我正在尝试从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)" .

这对我有用:

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

Dockerfile

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)" .

有了这个,你可以在构建阶段或运行阶段使用 ENTRYPOINT ["docker-entrypoint.sh"] 执行 git 克隆 git@github.com...(gitlab 或 bitbucket(。

如果您需要将任何文件作为参数传递给容器,这可能会起作用

安全

正如评论者所说,在构建时将文件传递给容器是不安全的。解决方法和最佳实践是:在 c.i(詹金斯、竹子、圆圈等(中克隆项目并执行docker build ...。 在 docker 中克隆项目通常只用于旧的必需库,而不是主源代码。

在运行docker build之前,我会使用您已经运行的 ssh 代理在主机上克隆它。

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

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

就像我在构建期间如何在 Dockerfile 中将主机卷挂载到 docker 容器中的回答中更详细地描述的那样,Docker 还提供 SSH 代理转发。这将使用 docker build 命令中的 --ssh 标志,以及您希望将 SSH 身份验证委派给主机上代理的任何 Dockerfile RUN命令中的--mount=type=ssh

最新更新