如何将本地计算机的 SSH 密钥传递给 docker 容器?
How to pass local machine's SSH key to 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.
如果我尝试在没有 运行ning 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)" .
我会在主机上克隆它,使用您已经拥有的 ssh-agent 运行ning,在您 运行 docker build
.
之前
如果您真的必须在图像中拥有私钥(您已经承认这是危险的),那么您应该能够将它放在默认位置 $HOME/.ssh/id_rsa
您在代码中拥有它的位置;不要尝试启动 ssh-agent。如果您的问题是积极的主机密钥检查,您也可以注入一个 $HOME/.ssh/config
文件,或者一个已经具有主机密钥的 $HOME/.ssh/known_hosts
文件。由于所有这些都是 文件,您可能会发现将它们放在 Docker 构建树中并将它们 COPY
放入 $HOME/.ssh
.[=16 中会更容易=]
这对我有用:
使用此解决方法: 将文件作为构建参数传递
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)" .
有了这个,你可以执行git克隆git@github.com...(gitlab,或者bitbucket) 在构建阶段或在 运行 阶段使用 ENTRYPOINT ["docker-entrypoint.sh"]
.
如果您需要将任何文件作为参数传递给您的容器,这可能会起作用
安全
正如评论者所说,在构建时将文件传递给容器是不安全的。解决方法和最佳实践是:在 c.i(jenkins、bamboo、circleci 等)中克隆项目并执行 docker build ...
。克隆 docker 内的项目通常只是针对旧的必需库,而不是主要源代码。
我正在尝试从 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.
如果我尝试在没有 运行ning 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)" .
我会在主机上克隆它,使用您已经拥有的 ssh-agent 运行ning,在您 运行 docker build
.
如果您真的必须在图像中拥有私钥(您已经承认这是危险的),那么您应该能够将它放在默认位置 $HOME/.ssh/id_rsa
您在代码中拥有它的位置;不要尝试启动 ssh-agent。如果您的问题是积极的主机密钥检查,您也可以注入一个 $HOME/.ssh/config
文件,或者一个已经具有主机密钥的 $HOME/.ssh/known_hosts
文件。由于所有这些都是 文件,您可能会发现将它们放在 Docker 构建树中并将它们 COPY
放入 $HOME/.ssh
.[=16 中会更容易=]
这对我有用:
使用此解决方法: 将文件作为构建参数传递
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)" .
有了这个,你可以执行git克隆git@github.com...(gitlab,或者bitbucket) 在构建阶段或在 运行 阶段使用 ENTRYPOINT ["docker-entrypoint.sh"]
.
如果您需要将任何文件作为参数传递给您的容器,这可能会起作用
安全
正如评论者所说,在构建时将文件传递给容器是不安全的。解决方法和最佳实践是:在 c.i(jenkins、bamboo、circleci 等)中克隆项目并执行 docker build ...
。克隆 docker 内的项目通常只是针对旧的必需库,而不是主要源代码。