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

Mic*_*ski 8 git ssh docker 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.
Run Code Online (Sandbox Code Playgroud)

如果我尝试简单地克隆存储库而不运行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
Run Code Online (Sandbox Code Playgroud)

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

docker build -t test  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" .
Run Code Online (Sandbox Code Playgroud)

JRi*_*dsz 13

这对我有用:

使用此解决方法: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
Run Code Online (Sandbox Code Playgroud)

建造

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

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

更新

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

  • 请注意,您的 SSH 私钥对于使用 docker History 命令的映像的任何用户都是可见的。请参阅 [使用 BuildKit 构建映像](https://docs.docker.com/develop/develop-images/build_enhancements/#using-ssh-to-access-private-data-in-builds) 部分了解安全构建图像时使用秘密的方法。 (3认同)

Dav*_*aze 4

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

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