在docker文件中将私钥添加到ssh-agent

Usm*_*hir 7 git ssh docker dockerfile

我正在尝试为angular cli项目编写一个docker文件,但我有一个外部依赖项,它是BitBucket上的私有仓库,所以我需要传递我的ssh密钥.我正在尝试使用ssh密钥--build-arg

现在的问题是,它没有将这些密钥添加到ssh-agent并要求输入密码.

我正在使用此命令运行 docker build -t ng-2-docker/client --build-arg ssh_prv_key="$(cat ~/.ssh/id_rsa)" --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa)" .

这是我的docker文件

ARG ssh_prv_key
ARG ssh_pub_key

# Use an official Node runtime as a parent image
FROM node:8.9.4

# Specify working directory in docker container
WORKDIR /app

# Authorize SSH Host
RUN mkdir -p /ssh/
RUN chmod 0700 /ssh

# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /ssh/id_rsa && echo "$ssh_pub_key" > /ssh/id_rsa.pub && chmod 600 /ssh/id_rsa && chmod 600 /ssh/id_rsa.pub

# add bitbucket to known hosts
RUN ssh-keyscan bitbucket.org > /ssh/known_hosts

# Copy SSH key to temp folder to pull new code
# ADD ~/.ssh/id_rsa /tmp/
# RUN ssh-agent /tmp
RUN ls -la /ssh

# check if ssh agent is running or not, if not, run
RUN eval `ssh-agent -s` && ssh-add /ssh/id_rsa

# Copy local files into the containers working directory
COPY package.json /app

# Install dependencies inside container
RUN npm i

# Copy local files into the containers working directory
COPY . /app

# Execute Process
CMD ["npm", "docker:rogers:local"]

# Remove ssh key from temp
# RUN rm /tmp/id_rsa
RUN rm -rf /ssh

# expose port
EXPOSE 4200
Run Code Online (Sandbox Code Playgroud)

如果我运行上面提到的命令,这是输出.

在此输入图像描述

小智 7

我花了几天时间来解决同样的问题。ssh-keygen -p 确保密码短语为空,但我需要在我的 Dockerfile 中 ssh-agent 和 ssh-add 才能从私人存储库中提取。我的几个同行告诉我,他们能够让它发挥作用;我会复制他们拥有的东西,但仍然被要求输入密码。最后我遇到了这个问题。在逐行手动输入 rsa 密钥并看到它成功后,我意识到这是因为我正在构建图像并通过 make 目标传入密钥,而 Makefile 正在将换行符处理为空格。最终,这只是更新密钥如何作为参数 cat 作为参数的问题,以便它作为 bash 运行而不是保留换行符。

这是我的 Makefile 中的构建命令:

make container:    
    docker build --rm \
    --build-arg ssh_prv_key="$$(cat ~/.ssh/id_rsa)" \
    --squash -f Dockerfile -t $(DOCKER_IMAGE) .
Run Code Online (Sandbox Code Playgroud)

我还会注意到我需要包括

echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config
Run Code Online (Sandbox Code Playgroud)

到我的 Dockerfile RUN 命令之一


Von*_*onC 5

已经完成此操作,我的密钥现在无需密码,但它仍在询问

然后...如果您没有与私钥关联的密码,您应该删除 Dockerfile 行:

# check if ssh agent is running or not, if not, run
RUN eval `ssh-agent -s` && ssh-add /ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

如果您不需要记住/缓存密码,则不需要 ssh 代理。


rol*_*rer 1

从您的屏幕截图来看,git-ssh 客户端不会询问您的 bitbucket 密码。您的私钥文件已使用密码加密。要使用私钥,ssh 将需要密码。

一种选择是从私钥中删除密码。您可以使用 ssh-keygen 编辑您的私钥:

$ ssh-keygen -p
Run Code Online (Sandbox Code Playgroud)

ssh-keygen 的来源