1. 简介

Alpine 是一个轻量级 Linux 发行版,设计目标是小巧、简洁和安全。由于其轻量特性,Alpine 被广泛用于容器化应用部署。本文将介绍如何在 Alpine 容器中安装 OpenSSH。

我们将先分析在 Alpine 容器中安装 OpenSSH 时可能遇到的问题,然后分别介绍两种安装方式:一种是在运行中的容器中安装,另一种是在构建镜像时通过 Dockerfile 安装。

2. Alpine 容器安装 OpenSSH 的常见问题

在 Linux 系统中,通常使用包管理工具来搜索、安装、升级或卸载软件。Alpine Linux 使用的是 apk 工具(Alpine Package Keeper)作为默认包管理器。

因此,最直接的安装方式是使用 apk 命令搜索或安装 OpenSSH。但在某些情况下,可能会遇到问题。

例如,执行以下命令搜索 OpenSSH:

# apk search openssh

WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.20/main: No such file or directory
WARNING: opening from cache https://dl-cdn.alpinelinux.org/alpine/v3.20/community: No such file or directory

或者尝试安装时,可能会遇到如下错误:

# apk add openssh

WARNING: Ignoring APKINDEX.d3812b7e.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.bb2c5760.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
  openssh (missing):
    required by: world[openssh]

这些问题的根本原因通常是 apk 的包索引未更新或缓存异常。解决这些问题的关键在于更新包索引。

3. 在运行中的 Alpine 容器中安装 OpenSSH

要在运行中的容器中正确安装 OpenSSH,首先需要更新包索引:

# apk update

fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/community/x86_64/APKINDEX.tar.gz
v3.20.2-168-gb223e202b56 [https://dl-cdn.alpinelinux.org/alpine/v3.20/main]
v3.20.2-171-g647c797a189 [https://dl-cdn.alpinelinux.org/alpine/v3.20/community]
OK: 24162 distinct packages available

更新完成后,即可安装 OpenSSH:

# apk add openssh

推荐方式:使用以下命令一次性完成更新和安装,同时避免缓存占用空间:

# apk add --update --no-cache openssh

fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/community/x86_64/APKINDEX.tar.gz
OK: 14 MiB in 24 packages

最后,可以通过以下命令验证安装是否成功:

# ssh -V

OpenSSH_9.7p1, OpenSSL 3.3.1 4 Jun 2024

4. 通过 Dockerfile 在 Alpine 镜像中安装 OpenSSH

如果你希望构建一个包含 OpenSSH 的 Alpine 镜像,可以在 Dockerfile 中添加安装命令:

FROM alpine:latest

RUN apk add --update --no-cache openssh

构建镜像:

$ docker build -t alpine-ssh .

启动容器并进入交互式 shell(注意 Alpine 默认使用的是 ash):

$ docker run -it alpine-ssh /bin/ash

验证 OpenSSH 版本:

# ssh -V

OpenSSH_9.7p1, OpenSSL 3.3.1 4 Jun 2024

⚠️ 踩坑提醒:确保 Dockerfile 中的 RUN 指令使用了 --update--no-cache 参数,否则可能因包索引未更新导致安装失败。

5. 总结

本文介绍了两种在 Alpine 容器中安装 OpenSSH 的方法:

  • 运行时安装:适用于临时调试或已有容器需要添加 SSH 支持;
  • 构建时安装:适用于制作自定义镜像,便于复用和部署。

两种方式都依赖于 apk 工具进行安装。关键点在于安装前务必执行 apk update 或使用 --update --no-cache 参数,以避免包索引缺失或缓存问题导致的安装失败。


原始标题:Install OpenSSH in an Alpine Container