Skip to content
共绩算力文档中心

如何在自己的镜像中配置 SSH

👋

ssh 修改配置时,必须关机之后才能进行修改

本指南详细阐述了在共绩算力平台上配置和使用 SSH 服务的完整技术方案。SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络中提供安全的远程登录、文件传输等服务。在容器化部署环境中,SSH 服务使得用户可以通过远程连接方式管理容器实例,进行代码调试、文件传输和系统维护等操作。通过本指南,用户可以了解在共绩算力平台上基础镜像与自定义镜像中 SSH 服务的区别,掌握通过命令行终端直接在运行中的容器内配置 SSH 服务的完整流程,并学习如何配置密码登录和免密登录两种认证方式。对于需要持久化配置的场景,也可以通过修改 Dockerfile 在镜像构建时预先配置 SSH 服务。

1. 基础镜像与自定义镜像的 SSH 配置差异

Section titled “1. 基础镜像与自定义镜像的 SSH 配置差异”

在共绩算力平台上部署容器服务时,用户可以选择使用平台提供的预制镜像或上传自定义镜像。这两种方式在 SSH 服务的配置上存在显著差异,理解这些差异有助于用户根据实际需求选择合适的部署方式。

平台提供的预制镜像(如 PaddlePaddle、PyTorch、TensorFlow 等深度学习框架镜像)已经预先安装了 OpenSSH 服务器(sshd),并完成了基本的配置工作。这些基础镜像在构建时已经执行了 SSH 服务的安装步骤,包括创建必要的系统目录、配置 SSH 守护进程参数、以及暴露标准的 22 端口。用户在使用这些预制镜像部署服务后,可以直接通过共绩算力平台提供的 SSH 端口暴露功能进行远程连接,无需进行额外的配置工作。这种方式适合大多数用户,特别是那些希望快速开始开发工作而不想花时间配置底层服务的开发者。

然而,当用户使用自定义镜像部署服务时,情况则完全不同。自定义镜像通常为了保持最小化体积和安全性,默认不包含 SSH 服务器。对于这种情况,共绩算力平台提供了命令行终端功能,允许用户在已运行的容器实例中直接执行命令来安装和配置 SSH 服务,无需重新构建镜像。这种方式操作简单、灵活便捷,特别适合需要在已有容器中临时添加 SSH 支持,或者对已部署的服务进行 SSH 配置调整的场景。用户可以在容器运行后通过平台的命令行终端访问容器,执行安装 SSH 服务、配置认证方式、启动服务等操作,配置完成后即可使用平台的 SSH 端口暴露功能进行远程访问。如果用户希望 SSH 配置在容器重启后能够持久化保存,也可以通过在 Dockerfile 中添加相应的配置步骤来实现,详细说明请参考文档末尾的相关章节。

2. 通过命令行终端直接配置 SSH 服务

Section titled “2. 通过命令行终端直接配置 SSH 服务”

共绩算力平台提供了命令行终端功能,允许用户在已运行的容器实例中直接执行命令来安装和配置 SSH 服务,这是最常用和最便捷的方式。通过平台提供的”命令行终端”功能,用户可以在浏览器中直接访问容器的命令行环境,无需预先配置 SSH 即可进行系统管理和配置操作。这种方式特别适合需要在已有容器中临时添加 SSH 支持,或者对已部署的服务进行 SSH 配置调整的场景。用户无需重新构建镜像,只需在容器运行后通过终端执行一系列命令即可完成 SSH 服务的配置,操作简单、灵活便捷。

在共绩算力平台的云主机详情页面,点击”命令行终端”标签页即可打开终端界面。终端界面提供了完整的命令行交互环境,支持常用的 Shell 命令和快捷键操作。在终端界面的”Command 配置”区域,可以选择默认的 Shell 环境,通常可以选择 /bin/bash/bin/sh,选择 /bin/bash 可以获得更丰富的命令补全和交互体验。终端连接成功后,界面右上角会显示”已连接”状态,表示已经成功连接到容器实例。用户可以在终端中输入命令并查看执行结果,就像在本地终端中操作一样。

2.2 在运行中的容器内安装 SSH 服务

Section titled “2.2 在运行中的容器内安装 SSH 服务”

如果容器镜像中没有预装 SSH 服务,可以通过命令行终端直接安装。首先需要确认当前容器的操作系统类型,可以通过 cat /etc/os-release 命令查看系统信息。对于基于 Debian 或 Ubuntu 的系统,使用 apt-get 包管理器安装 openssh-server。执行 apt-get update 命令更新软件包列表,然后执行 apt-get install -y openssh-server 安装 SSH 服务器。安装过程中系统会自动创建必要的配置文件和目录结构,包括 /etc/ssh/sshd_config 配置文件和 /var/run/sshd 运行目录。

Terminal window
apt-get update
apt-get install -y openssh-server

安装完成后,需要创建 SSH 守护进程运行所需的目录。sshd 在运行时需要权限分离目录来存储临时文件和套接字,如果这些目录不存在,SSH 服务将无法正常启动。在某些容器环境中,系统可能不会自动创建这些目录,需要手动创建。通常情况下需要创建 /run/sshd 目录,有些系统也使用 /var/run/sshd/run 通常是 /var/run 的符号链接,但在某些容器环境中可能不存在)。为了确保兼容性,建议同时创建这两个目录。

Terminal window
mkdir -p /run/sshd
mkdir -p /var/run/sshd

如果遇到 “Missing privilege separation directory: /run/sshd” 错误,说明 /run/sshd 目录不存在,执行上述命令创建目录后即可解决问题。

安装 SSH 服务后,需要通过命令行配置用户认证方式。配置密码登录时,首先使用 chpasswd 命令设置 root 用户或其他用户的密码。chpasswd 命令从标准输入读取”用户名:密码”格式的数据,可以通过 echo 命令将密码传递给 chpasswd。例如,执行 echo 'root:yourpassword' | chpasswd 即可将 root 用户的密码设置为 yourpassword。需要注意的是,在命令行中输入密码时,密码会显示在终端中,建议在设置完成后及时清除终端历史记录,避免密码泄露。

Terminal window
echo 'root:yourpassword' | chpasswd

设置密码后,需要修改 SSH 配置文件以允许密码认证和 root 用户登录。使用 sed 命令编辑 /etc/ssh/sshd_config 文件,将 PermitRootLogin 选项设置为 yes,将 PasswordAuthentication 选项设置为 yes。如果配置文件中这些选项被注释掉了(以 # 开头),sed 命令会自动取消注释并修改值。修改完成后,可以使用 grep 命令验证配置是否正确,例如执行 grep -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config 查看相关配置项。

Terminal window
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

配置免密登录需要创建 .ssh 目录和 authorized_keys 文件,并将用户的公钥添加到文件中。首先在用户主目录下创建 .ssh 目录,通常 root 用户的主目录是 /root,其他用户的主目录在 /home/用户名。使用 mkdir -p 命令创建目录,-p 参数表示如果目录已存在则不报错。然后设置目录权限为 700,确保只有所有者可以访问。接下来创建 authorized_keys 文件,可以使用 echo 命令将公钥内容追加到文件中,或者使用文本编辑器直接编辑文件。设置文件权限为 600,确保只有所有者可以读写。如果公钥内容较长,可以通过复制粘贴的方式添加到文件中,或者使用 cat 命令配合输入重定向。

Terminal window
mkdir -p /root/.ssh
chmod 700 /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..." >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

如果需要添加多个公钥,可以将每个公钥分别追加到 authorized_keys 文件中,每个公钥占一行。也可以从本地文件复制公钥内容,先使用文本编辑器在本地创建包含公钥内容的临时文件,然后通过平台的文件上传功能或复制粘贴的方式将内容添加到容器中的 authorized_keys 文件。

配置完成后,需要启动 SSH 服务。在容器环境中,不能使用 systemctl 等系统服务管理工具,需要直接运行 sshd 守护进程。执行 /usr/sbin/sshd -D 命令启动 SSH 服务,-D 参数表示以前台模式运行,这样可以在终端中实时查看服务的运行状态和日志信息。

Terminal window
/usr/sbin/sshd -D

如果启动时没有显示任何信息,或者希望看到更详细的调试信息,可以使用调试模式启动 SSH 服务。调试模式会输出详细的启动过程和运行日志,有助于诊断问题:

Terminal window
/usr/sbin/sshd -D -d

-d 参数表示以调试模式运行,会在终端中显示详细的调试信息。如果需要更详细的调试信息,可以使用 -dd(更详细)或 -ddd(最详细)参数。调试模式启动后,终端会一直显示日志信息,直到服务被终止。

需要注意的是,如果在命令行终端中以前台模式启动 sshd,终端会被 sshd 进程占用,无法继续输入其他命令。如果需要在启动 SSH 服务后继续使用终端执行其他操作,可以在后台运行 sshd,使用 nohup /usr/sbin/sshd -D & 命令将服务放到后台运行,或者使用 screentmux 等终端复用工具创建一个新的会话。另外,如果容器的主进程不是 sshd,需要确保在容器启动脚本或配置中正确启动 SSH 服务,这样才能在容器重启后自动启动 SSH 服务。

如果需要在启动 SSH 服务后继续使用终端执行其他命令,可以使用后台启动方式:

Terminal window
nohup /usr/sbin/sshd -D > /tmp/sshd.log 2>&1 &

启动后会显示进程 ID(PID),可以通过查看日志文件 /tmp/sshd.log 来确认服务是否正常启动。也可以直接使用 nohup /usr/sbin/sshd -D & 命令,输出会重定向到 nohup.out 文件中。

启动完成后,建议立即验证服务状态,确认 SSH 服务正常运行。可以通过检查进程、端口监听状态等方式来验证,详细步骤请参考下一节的”验证 SSH 配置”。

配置完成后,应该验证 SSH 服务是否正常工作。首先检查 sshd 进程是否正在运行,执行 ps aux | grep sshd 命令查看进程列表,应该能看到 sshd 主进程和可能的子进程。检查 SSH 服务是否在正确的端口上监听,执行 netstat -tlnp | grep 22ss -tlnp | grep 22 命令,应该能看到 22 端口处于监听状态。检查 SSH 配置文件语法是否正确,执行 sshd -t 命令进行配置测试,如果配置文件有语法错误会显示错误信息,如果配置正确则不会有任何输出。

Terminal window
ps aux | grep sshd
netstat -tlnp | grep 22
ss -tlnp | grep 22
sshd -t

如果配置了密码登录,可以尝试在另一个终端会话中使用密码登录进行测试。如果配置了免密登录,可以尝试使用对应的私钥进行连接测试。需要注意的是,通过命令行终端配置的 SSH 服务在容器重启后可能会丢失,因为这些配置是在容器运行时修改的,没有写入镜像。如果需要持久化配置,可以将配置步骤添加到 Dockerfile 中重新构建镜像,详细说明请参考文档末尾的”在自定义镜像中安装和配置 SSH 服务”章节。

3. 在共绩算力平台上使用 SSH 端口暴露

Section titled “3. 在共绩算力平台上使用 SSH 端口暴露”

完成 SSH 服务配置后,即可在共绩算力平台上使用 SSH 端口暴露功能进行远程访问。共绩算力平台提供了便捷的端口暴露功能,可以将容器内的 SSH 端口(22)映射到平台提供的公网地址,用户无需手动配置网络和防火墙规则即可实现远程访问。无论是通过 Dockerfile 预先配置的 SSH 服务,还是通过命令行终端临时配置的 SSH 服务,都可以使用相同的端口暴露功能进行访问。

在共绩算力平台的部署服务详情页面,找到”端口暴露”或”网络配置”选项,添加端口映射规则。将容器内的 22 端口映射到平台的公网地址,平台会自动分配一个外部端口或域名。配置完成后,平台会显示完整的 SSH 连接信息,包括主机地址、端口号以及连接命令示例。用户可以使用这些信息通过本地 SSH 客户端连接到容器实例。

使用 SSH 客户端连接到容器时,如果配置了密码登录,直接使用 ssh 命令连接并输入设置的密码即可。如果配置了免密登录,需要确保本地有对应的私钥文件,SSH 客户端会自动使用私钥进行认证。连接成功后,用户就可以像操作普通 Linux 系统一样,执行各种命令、编辑文件、安装软件、查看日志等操作。

Terminal window
ssh root@your-host-address -p your-port
ssh root@your-host-address -p your-port

在配置和使用 SSH 服务时,安全性是至关重要的考虑因素。以下提供一些安全最佳实践建议,帮助用户构建更安全的容器环境。

密码安全方面,如果使用密码登录方式,应该设置强密码,包含大小写字母、数字和特殊字符,长度至少 12 位。避免使用容易被猜到的密码,如”123456”、“password”等常见密码。定期更换密码,特别是在发现可能存在安全风险的情况下。对于生产环境,强烈建议禁用密码登录,仅使用公钥认证方式,这样可以有效防止暴力破解攻击。

公钥管理方面,使用免密登录时,应该妥善保管私钥文件,不要将私钥提交到代码仓库或分享给他人。私钥文件应该设置正确的权限(通常为 600),只有所有者可以读取。定期轮换密钥对,及时撤销不再使用的公钥。对于团队协作场景,可以为每个团队成员单独配置公钥,这样可以精确控制访问权限,当成员离开团队时只需删除对应的公钥即可。

SSH 配置优化方面,可以修改 /etc/ssh/sshd_config 文件,禁用不必要的功能以提高安全性。例如,可以设置 MaxAuthTries 选项限制认证尝试次数,防止暴力破解。可以设置 ClientAliveInterval 和 ClientAliveCountMax 选项来管理空闲连接,自动断开长时间不活动的会话。可以禁用 X11 转发、端口转发等不需要的功能,减少潜在的攻击面。可以配置日志记录,将 SSH 连接日志保存到安全的位置,便于后续审计和问题排查。

网络安全方面,虽然共绩算力平台提供了公网访问能力,但在可能的情况下,应该优先使用 VPN 或内网连接,减少暴露在公网的风险。如果必须使用公网访问,应该定期检查连接日志,发现异常连接及时处理。可以配置防火墙规则,限制只允许特定 IP 地址访问 SSH 端口,进一步提高安全性。

在使用 SSH 服务的过程中,可能会遇到一些问题,以下提供常见问题的解决方案,帮助用户快速定位和解决问题。

无法连接 SSH 服务时,首先检查容器是否正常运行,可以通过共绩算力平台的控制台查看容器状态和日志。如果容器没有运行,检查 Dockerfile 中的启动命令是否正确,确保 sshd 命令使用了 -D 参数以前台模式运行。检查 SSH 服务是否正常启动,可以在容器内部执行 ps aux | grep sshd 命令查看进程是否存在,或者检查 /var/log/auth.log 日志文件查看错误信息。检查端口映射配置是否正确,确认平台上的端口暴露配置将容器的 22 端口正确映射到了外部。

认证失败问题时,如果使用密码登录,确认密码是否正确,注意密码中的大小写和特殊字符。检查 SSH 配置文件中 PermitRootLogin 和 PasswordAuthentication 选项是否正确设置。如果使用免密登录,检查公钥是否正确添加到 authorized_keys 文件中,可以使用 cat /root/.ssh/authorized_keys 命令查看文件内容。检查文件权限是否正确,authorized_keys 文件的权限应该是 600,.ssh 目录的权限应该是 700。如果权限不正确,使用 chmod 命令修正权限后重新尝试连接。

权限问题方面,SSH 对文件权限有严格要求,如果权限设置不正确,即使配置看起来正确,认证也会失败。确保 .ssh 目录的权限为 700,authorized_keys 文件的权限为 600。不要在用户主目录或 .ssh 目录上设置过于宽松的权限,这可能导致 SSH 拒绝连接。如果是在构建镜像时设置权限,确保 Dockerfile 中的 chmod 命令正确执行,没有被后续的操作覆盖。

连接超时或断开问题时,检查网络连接是否稳定,可以通过 ping 命令测试网络连通性。检查 SSH 配置中的超时设置,可以适当调整 ClientAliveInterval 和 ClientAliveCountMax 选项的值。检查防火墙规则,确保没有阻止 SSH 连接。如果是在共绩算力平台上,检查端口暴露配置是否正确,确认外部可以访问映射的端口。

性能问题方面,如果 SSH 连接速度较慢,可以尝试使用更快的加密算法,在 SSH 配置中设置 Ciphers 和 MACs 选项。检查容器资源限制,确保有足够的 CPU 和内存资源。如果连接延迟较高,考虑使用更近的地理位置的服务器节点。对于频繁的文件传输操作,考虑使用 SCP 或 SFTP 协议,这些协议针对文件传输进行了优化。

6. 在自定义镜像中安装和配置 SSH 服务(通过 Dockerfile)

Section titled “6. 在自定义镜像中安装和配置 SSH 服务(通过 Dockerfile)”

对于需要持久化 SSH 配置的场景,用户可以通过修改 Dockerfile 在镜像构建时预先安装和配置 SSH 服务。这种方式适合需要将 SSH 服务作为容器标准配置的场景,或者需要在多个容器实例中复用相同配置的场景。通过在 Dockerfile 中添加相应的配置步骤,可以在镜像构建时就将 SSH 服务配置完成,容器启动后即可使用,无需每次都在运行时手动配置。需要注意的是,通过这种方式配置的 SSH 服务会在镜像中持久化保存,容器重启后配置不会丢失。

首先需要在 Dockerfile 中添加安装 OpenSSH 服务器的步骤。OpenSSH 是 SSH 协议的开源实现,包含了 sshd 守护进程和相关的工具。使用 apt-get 包管理器安装 openssh-server 软件包,安装过程中系统会自动创建必要的配置文件和目录结构。为了确保安装过程顺利,建议先执行 apt-get update 命令更新软件包列表,这样可以获取最新的软件包信息和依赖关系。安装命令需要使用 -y 参数以非交互方式执行,避免构建过程中因为需要用户确认而中断。

FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y openssh-server && \
rm -rf /var/lib/apt/lists/*

安装完成后,需要创建 SSH 守护进程运行所需的目录。sshd 在运行时需要在 /var/run/sshd 目录中创建一些临时文件,用于存储进程 ID 和套接字等信息。如果这个目录不存在,sshd 服务将无法正常启动。因此需要在 Dockerfile 中使用 mkdir 命令创建该目录,并确保目录具有正确的权限。

RUN mkdir -p /var/run/sshd

SSH 服务支持多种用户认证方式,包括密码认证和公钥认证(免密登录)。用户可以根据安全需求和便利性选择合适的认证方式,或者同时配置两种方式以提供更多灵活性。

配置密码登录是最简单直接的方式,适合快速测试和开发环境使用。首先需要为用户设置密码,可以使用 echo 命令结合 chpasswd 工具来设置密码。chpasswd 是一个用于批量修改用户密码的命令行工具,它从标准输入读取用户名和密码对,格式为”用户名:密码”。需要注意的是,密码应该以明文形式传递给 chpasswd,因此在使用时要注意安全性,避免将包含密码的 Dockerfile 提交到公开的代码仓库中。生产环境建议使用环境变量或密钥管理服务来传递敏感信息。

RUN echo 'root:yourpassword' | chpasswd

设置密码后,需要修改 SSH 配置文件 /etc/ssh/sshd_config,以允许密码认证和 root 用户登录。默认情况下,SSH 配置可能禁止 root 用户直接登录,或者禁用密码认证方式。需要使用 sed 命令修改配置文件,将相关选项的值改为允许。PermitRootLogin 选项控制是否允许 root 用户通过 SSH 登录,将其设置为 yes 即可允许。PasswordAuthentication 选项控制是否允许使用密码进行认证,也需要设置为 yes。

RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

免密登录(公钥认证)是更安全和便捷的认证方式,特别适合生产环境和频繁访问的场景。配置免密登录需要将用户的公钥添加到容器的授权密钥文件中。每个用户的公钥存储在对应的 ~/.ssh/authorized_keys 文件中,当用户尝试连接时,SSH 服务器会验证客户端提供的私钥是否与存储的公钥匹配,匹配成功则允许登录,无需输入密码。

首先需要在 Dockerfile 中创建 .ssh 目录和 authorized_keys 文件,并设置正确的权限。SSH 对文件权限有严格要求,如果权限设置不正确,即使配置了公钥,认证也会失败。通常 authorized_keys 文件的权限应该设置为 600(仅所有者可读写),.ssh 目录的权限应该设置为 700(仅所有者可访问)。然后将用户的公钥内容添加到 authorized_keys 文件中,公钥内容可以通过环境变量、构建参数或挂载卷的方式传入。

RUN mkdir -p /root/.ssh && \
chmod 700 /root/.ssh && \
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..." > /root/.ssh/authorized_keys && \
chmod 600 /root/.ssh/authorized_keys

如果需要支持多用户访问,可以为每个用户分别创建对应的 .ssh 目录和 authorized_keys 文件。也可以配置 SSH 服务器使用统一的授权密钥文件,在 /etc/ssh/sshd_config 中设置 AuthorizedKeysFile 选项来指定密钥文件的路径。

SSH 服务默认使用 22 端口进行通信,需要在 Dockerfile 中使用 EXPOSE 指令声明该端口。EXPOSE 指令不会实际开放端口,只是作为文档说明,告诉使用该镜像的用户容器会监听哪些端口。实际的端口映射需要在运行容器时通过 -p 参数或共绩算力平台的端口配置来完成。

EXPOSE 22

容器启动时需要运行 SSH 守护进程,可以使用 CMD 或 ENTRYPOINT 指令来设置启动命令。sshd 命令的 -D 参数表示以前台模式运行守护进程,这样容器会持续运行而不会立即退出。如果不使用 -D 参数,sshd 会在后台运行并立即返回,导致容器退出。也可以使用 systemd 或其他服务管理工具来管理 SSH 服务,但在容器环境中,直接运行守护进程是最简单的方式。

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

以下提供完整的 Dockerfile 示例,分别展示配置密码登录、免密登录以及混合配置的完整流程。用户可以根据实际需求选择合适的配置方式。

此示例展示如何配置基于密码的 SSH 登录方式,适合快速测试和开发环境使用。

FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y openssh-server && \
rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/run/sshd
RUN echo 'root:yourpassword' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

此示例展示如何配置基于公钥的免密登录方式,适合生产环境和频繁访问的场景。公钥内容通过构建参数传入,提高了安全性和灵活性。

FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y openssh-server && \
rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/run/sshd
ARG SSH_PUBLIC_KEY
RUN mkdir -p /root/.ssh && \
chmod 700 /root/.ssh && \
echo "${SSH_PUBLIC_KEY}" > /root/.ssh/authorized_keys && \
chmod 600 /root/.ssh/authorized_keys
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

构建此镜像时,需要传入 SSH_PUBLIC_KEY 构建参数,例如:

Terminal window
docker build --build-arg SSH_PUBLIC_KEY="$(cat ~/.ssh/id_rsa.pub)" -t my_ssh_image .

此示例同时配置密码登录和免密登录两种方式,提供最大的灵活性。用户可以优先使用免密登录,在密钥不可用时还可以使用密码登录作为备选方案。

FROM ubuntu:latest
RUN apt-get update && \
apt-get install -y openssh-server && \
rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/run/sshd
RUN echo 'root:yourpassword' | chpasswd
ARG SSH_PUBLIC_KEY
RUN if [ -n "$SSH_PUBLIC_KEY" ]; then \
mkdir -p /root/.ssh && \
chmod 700 /root/.ssh && \
echo "$SSH_PUBLIC_KEY" > /root/.ssh/authorized_keys && \
chmod 600 /root/.ssh/authorized_keys; \
fi
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]