ssh加载项无法打开与身份验证代理的连接



我正在尝试为我的Python烧瓶API创建一个docker镜像。

我需要git来安装依赖项,我已经在docker中安装了几次git。但在这里,我无法理解我做错了什么。

与码头工人:

FROM python:3.6-slim
ARG ssh_prv_key
ARG ssh_pub_key
RUN apt-get update && 
apt-get install -y openssh-server &&
apt-get install -y git
# Authorize SSH Host
RUN mkdir -p /root/.ssh && 
chmod 0700 /root/.ssh && 
ssh-keyscan github.com > /root/.ssh/known_hosts
# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && 
echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && 
chmod 600 /root/.ssh/id_rsa && 
chmod 600 /root/.ssh/id_rsa.pub && 
echo "StrictHostKeyChecking no " > /root/.ssh/config

RUN eval "$(ssh-agent -s)"
RUN ssh-add /root/.ssh/id_rsa
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN pip3 install --no-cache-dir -r requirements.txt
# Remove SSH keys
RUN rm -rf /root/.ssh/
COPY ./my_api /usr/src/app
# Expose the Flask port
EXPOSE 5000
CMD [ "python", "./app.py" ]

我执行命令:

docker build --build-arg ssh_prv_key=.keys/id_rsa --build-arg ssh_pub_key=.keys/id_rsa.pub -t my-api -f Dockerfile . 

这给了我以下错误:

Step 7/16 : RUN eval "$(ssh-agent -s)"
---> Running in be450cc39533
Agent pid 9
Removing intermediate container be450cc39533
---> fb101226dc5f
Step 8/16 : RUN ssh-add /root/.ssh/id_rsa
---> Running in 4288e93db584
Could not open a connection to your authentication agent.
The command '/bin/sh -c ssh-add /root/.ssh/id_rsa' returned a non-zero code: 2

ssh代理的eval函数检索PID,但我无法连接到它。

已解决

我终于发现我做错了什么。首先,我的构建参数不正确。正确的docker build命令如下:

docker build --build-arg ssh_prv_key="$(cat .keys/id_rsa)" --build-arg ssh_pub_key="$(cat .keys/id_rsa.pub)" -t my-api -f Dockerfile . 

此外,我不知道为什么,git在不使用的情况下正确处理了我的ssh密钥

RUN eval "$(ssh-agent -s)"
RUN ssh-add /root/.ssh/id_rsa  

上面导致的命令无法连接到您的代理错误。

然后,正确的文件是

FROM python:3.6-slim
ARG ssh_prv_key
ARG ssh_pub_key
RUN apt-get update && 
apt-get install -y git
# Authorize SSH Host
RUN mkdir -p /root/.ssh && 
chmod 0700 /root/.ssh && 
ssh-keyscan github.com > /root/.ssh/known_hosts
# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && 
echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && 
chmod 600 /root/.ssh/id_rsa && 
chmod 600 /root/.ssh/id_rsa.pub

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN pip3 install --no-cache-dir -r requirements.txt
# Remove SSH keys
RUN rm -rf /root/.ssh/
COPY ./my_api /usr/src/app
# Expose the Flask port
EXPOSE 5000
CMD [ "python", "./app.py" ]

我认为与容器中的ssh配置有关的问题,Ubuntu中默认的ssh策略是拒绝root远程登录。

要启用它,请将以下行添加到Dockerfile中。

RUN echo"PermitRootLogin yes">>/etc/ssh/sshd_config

这一行编辑/etc/ssh/sshd_config文件以允许root登录,但您需要重新启动sshd服务,为此,您必须在Dockerfile中添加以下行。

RUN systemctl重新启动sshd

此外,如果您信任证书,只需在ssh-add中添加-K标志即可。

运行ssh add-k/root/.ssh/id_rssa

当将密钥加载到代理或从代理中删除密钥时,将使用-k选项,只处理普通私钥并跳过证书。

我希望这能有所帮助
致问候,

而不是编写这些命令

RUN eval "$(ssh-agent -s)"
RUN ssh-add /root/.ssh/id_rsa  
RUN pip3 install --no-cache-dir -r requirements.txt

使用不同的RUN语句,在单层中执行它们,即:

RUN eval "$(ssh-agent -s)" && 
ssh-add /root/.ssh/id_rsa && 
pip3 install --no-cache-dir -r requirements.txt

尝试过这个,它没有任何问题。

最近,您可以使用build命令指定ssh选项:https://docs.docker.com/compose/compose-file/build/#ssh

docker compose文件中的配置如下:

build:
context: .
ssh: 
- default   # mount the default ssh agent

后期编辑(2022年7月30日(:

这个ssh功能是不久前添加的,github上有一个关于实现它的大线程。最近在一个用于CI/CD管道和对docker compose的cli支持的项目中尝试过使用它,但ssh不存在。我们通过使用docker build命令解决了这个问题:

DOCKER_BUILDKIT=1 docker build --ssh default=${SSH_KEY_PATH} -t imagename .

然后,在docker compose文件中,只需使用新建的图像名称:

services:
servicename:
image: imagename
container_name: containername
...

最新更新