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

时间:2018-08-07 17:22:14

标签: git docker ssh dockerfile docker-container

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

2 个答案:

答案 0 :(得分:2)

这对我有用:

使用此解决方法:https://stackoverflow.com/a/47544999/3957754将文件作为生成args传递

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

有了这个,您可以在构建阶段或使用docker-entrypoint技术执行 git clone git@github.com ... (gitlab或bitbucket)。

答案 1 :(得分:1)

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

如果确实需要在映像中包含私钥(您已经确认这很危险),则应该可以将其保存在代码中的默认位置$HOME/.ssh/id_rsa处;不要尝试启动ssh-agent。如果您的问题是积极的主机密钥检查,或者您已经拥有主机密钥的$HOME/.ssh/config文件,也可以注入$HOME/.ssh/known_hosts文件。由于所有这些都是文件,因此您可能会发现将它们包含在Docker构建树中并将它们COPY放入$HOME/.ssh会更容易。