我正在尝试从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 [email protected] || true && npm install
和命令(我将私钥作为构建参数传递):
docker build -t test --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" .
在运行docker build
之前,我使用你已运行的ssh-agent在主机上克隆它。
如果你真的必须在图像中拥有私钥(你已经承认它是危险的)那么你应该能够将它放在你的代码中的默认位置$HOME/.ssh/id_rsa
;不要尝试启动ssh-agent。如果您的问题是积极的主机密钥检查,或者已经有主机密钥的$HOME/.ssh/config
文件,您也可以注入$HOME/.ssh/known_hosts
文件。由于所有这些都是文件,您可能会发现将它们放在Docker构建树中更容易,并将它们放入COPY
中。
这对我有用:
使用此解决方法:$HOME/.ssh
将文件作为构建参数传递
Dockerfile
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-entrypoint技术执行git clone [email protected] ...(gitlab,或bitbucket)。