如何通过COPY --from=在Dockerfile中安装OpenSSH Server构建最小镜像
用COPY --from方式在Docker镜像中安装OpenSSH Server
一、基础镜像选择建议
- 优先选alpine/openssh而非linuxserver/openssh-server,前者基于Alpine,体积更小、文件结构更简洁,更适合用COPY方式提取文件;后者基于Debian/Ubuntu,依赖链复杂,后续COPY步骤会繁琐很多
- 如果必须用linuxserver/openssh-server,需提前进入容器梳理所有依赖文件,成本更高
二、从alpine/openssh提取文件的核心清单
1. 核心二进制文件
直接复制主程序及配套工具:
/usr/sbin/sshd:SSH服务主进程/usr/bin/ssh-keygen:密钥生成工具/usr/bin/sshd-keygen:初始化SSH密钥的脚本
2. 依赖库文件
先在alpine/openssh容器中执行ldd /usr/sbin/sshd查看依赖,再把对应库文件复制到目标镜像的同路径下,示例依赖(以实际输出为准):
/lib/libcrypto.so.1.1 /lib/libc.so.6 /lib/libz.so.1
3. 配置与必要目录
- 配置目录:
/etc/ssh/(包含sshd_config等核心配置,建议整目录复制) - 运行时目录:
/var/run/sshd/(需提前创建,用于存放服务PID文件) - 密钥文件:
/etc/ssh/ssh_host_*(可在容器启动时用sshd-keygen生成,也可提前复制已生成的密钥)
三、Dockerfile示例
# 基础镜像选用最小的alpine镜像 FROM alpine:latest AS target-base # 拉取SSH源镜像 FROM alpine/openssh:latest AS ssh-source # 构建目标镜像 FROM target-base # 复制SSH二进制文件 COPY --from=ssh-source /usr/sbin/sshd /usr/sbin/sshd COPY --from=ssh-source /usr/bin/ssh-keygen /usr/bin/ssh-keygen COPY --from=ssh-source /usr/bin/sshd-keygen /usr/bin/sshd-keygen # 复制依赖库(根据ldd结果调整) COPY --from=ssh-source /lib/libcrypto.so.1.1 /lib/libcrypto.so.1.1 COPY --from=ssh-source /lib/libc.so.6 /lib/libc.so.6 COPY --from=ssh-source /lib/libz.so.1 /lib/libz.so.1 # 复制配置目录 COPY --from=ssh-source /etc/ssh /etc/ssh # 创建必要的运行目录 RUN mkdir -p /var/run/sshd # 设置启动命令 CMD ["/usr/sbin/sshd", "-D"]
四、关键注意事项
- 复制后需验证文件权限,确保
sshd拥有执行权限(可通过RUN chmod +x /usr/sbin/sshd兜底) - 必须保证源镜像与目标镜像的libc类型一致(比如alpine用musl libc,不能复制到基于glibc的镜像中),否则程序会无法运行
- 不确定文件路径时,可执行
docker run --rm -it alpine/openssh sh进入源容器,手动排查所有需要的文件
内容的提问来源于stack exchange,提问作者Ozymandias
相关产品推荐
相关产品推荐

