You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Dockerfile为容器配置SSH密钥以测试Ansible

两种自动化配置容器SSH连接的方案

针对你在M1 Mac上用容器搭建Ansible控制端/目标端的需求,这里提供两种通过Dockerfile实现SSH密钥自动配置的方案:


方案一:构建镜像时自动生成并注入密钥对

这种方案无需本地预先生成密钥,全程通过Docker构建流程完成密钥生成与配置。

1. 目标端(target)Dockerfile

FROM alpine:latest

# 安装openssh并配置sshd允许root密钥登录
RUN apk add --no-cache openssh \
    && mkdir -p /root/.ssh \
    && chmod 700 /root/.ssh \
    && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \
    && echo "PasswordAuthentication no" >> /etc/ssh/sshd_config \
    && ssh-keygen -A

# 通过构建参数注入控制端公钥
ARG SSH_PUB_KEY
RUN echo "$SSH_PUB_KEY" > /root/.ssh/authorized_keys \
    && chmod 600 /root/.ssh/authorized_keys

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

2. 控制端(controller)Dockerfile

FROM alpine:latest

# 安装openssh和ansible
RUN apk add --no-cache openssh ansible

# 生成无密码SSH密钥对
RUN ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""

# 导出公钥到临时文件,方便构建时提取
RUN cat /root/.ssh/id_ed25519.pub > /tmp/controller.pub

CMD ["/bin/sh"]

3. 构建与启动步骤

# 构建控制端镜像并提取公钥到本地
docker build -t ansible-controller . -f Dockerfile.controller
docker run --rm ansible-controller cat /tmp/controller.pub > controller.pub

# 用提取的公钥构建目标端镜像
docker build -t ansible-target . -f Dockerfile.target --build-arg SSH_PUB_KEY="$(cat controller.pub)"

# 创建网络并启动容器
docker network create localnet
docker run -d --name target --network localnet ansible-target
docker run -it --name controller --network localnet ansible-controller

启动后在控制端容器内直接执行 ssh root@target 即可连接。


方案二:本地生成密钥,构建时注入容器

这种方案将密钥保存在本地,可重复使用,适合需要固定密钥的场景。

1. 本地生成无密码密钥对

ssh-keygen -t ed25519 -f ./ansible_key -N ""

2. 目标端Dockerfile

FROM alpine:latest

RUN apk add --no-cache openssh \
    && mkdir -p /root/.ssh \
    && chmod 700 /root/.ssh \
    && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \
    && echo "PasswordAuthentication no" >> /etc/ssh/sshd_config \
    && ssh-keygen -A

# 复制本地公钥到容器授权列表
COPY ansible_key.pub /root/.ssh/authorized_keys
RUN chmod 600 /root/.ssh/authorized_keys

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

3. 控制端Dockerfile

FROM alpine:latest

RUN apk add --no-cache openssh ansible

# 复制本地私钥到容器
COPY ansible_key /root/.ssh/id_ed25519
RUN chmod 600 /root/.ssh/id_ed25519

# 可选:提前添加目标端到known_hosts,避免首次连接确认
RUN echo "target ssh-ed25519 $(cat ansible_key.pub | awk '{print $2}')" >> /root/.ssh/known_hosts

CMD ["/bin/sh"]

4. 构建与启动步骤

# 构建镜像
docker build -t ansible-target . -f Dockerfile.target
docker build -t ansible-controller . -f Dockerfile.controller

# 创建网络并启动容器
docker network create localnet
docker run -d --name target --network localnet ansible-target
docker run -it --name controller --network localnet ansible-controller

关键注意事项

  • Alpine系统的sshd默认禁止root登录,必须在配置中添加 PermitRootLogin yes
  • SSH密钥文件权限必须为600,密钥目录权限必须为700,否则会被SSH服务拒绝
  • 若不想手动处理known_hosts,可在控制端启动时执行 ssh-keyscan target >> /root/.ssh/known_hosts

内容的提问来源于stack exchange,提问作者hardik-ddod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:35:31