基于Alpine3.13的Docker容器升级OpenSSL失败,该如何解决?
问题分析
你无法升级OpenSSL到1.1.1l及以上版本的核心原因有两点:
- 你使用
apk add --update openssl的方式错误,add仅负责安装包,不会主动升级已安装的包; - 你添加了Alpine 3.8的仓库,该仓库仅提供OpenSSL 1.0.x版本,会干扰Alpine 3.13仓库中高版本OpenSSL的升级逻辑。
同时你需要保留libcrypto1.0和libssl1.0用于wkhtmltopdf,所以需要在不破坏该依赖的前提下完成OpenSSL升级。
解决方案
方案一:调整操作顺序+临时维护仓库列表
通过先升级OpenSSL,再临时添加Alpine 3.8仓库安装旧版依赖,最后移除旧仓库避免后续干扰:
FROM php:7.4.21-fpm-alpine3.13 # 先更新索引并升级OpenSSL到Alpine 3.13仓库的最新可用版本(1.1.1s,满足1.1.1l以上要求) RUN apk update && apk upgrade --no-cache openssl # 安装其他基础依赖 RUN apk add --no-cache --virtual .ext-deps \ nodejs \ npm \ git \ libzip-dev unzip RUN apk add --no-cache \ jpegoptim optipng pngquant gifsicle # 临时添加Alpine 3.8仓库安装wkhtmltopdf依赖,完成后立即移除该仓库 RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.8/main' >> /etc/apk/repositories && \ apk add --no-cache libcrypto1.0 libssl1.0 && \ sed -i '/alpine\/v3.8\/main/d' /etc/apk/repositories
方案二:指定仓库安装旧版依赖(不修改全局仓库)
直接通过--repository参数临时指定Alpine 3.8仓库安装旧版库,避免修改全局仓库列表:
FROM php:7.4.21-fpm-alpine3.13 # 更新索引并升级OpenSSL RUN apk update && apk upgrade --no-cache openssl # 安装其他基础依赖 RUN apk add --no-cache --virtual .ext-deps \ nodejs \ npm \ git \ libzip-dev unzip RUN apk add --no-cache \ jpegoptim optipng pngquant gifsicle # 直接从Alpine 3.8仓库安装旧版依赖,不修改全局仓库配置 RUN apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/v3.8/main libcrypto1.0 libssl1.0
关键说明
- 执行
apk upgrade openssl才是升级已安装包的正确命令,而非apk add; - Alpine 3.13官方仓库提供的OpenSSL最新版本为1.1.1s,已经满足你升级到1.1.1l的需求,无需手动编译源码;
- 两种方案都确保了旧版依赖仅用于wkhtmltopdf,不会干扰高版本OpenSSL的正常使用。
内容的提问来源于stack exchange,提问作者Roman Zagday
相关产品推荐
相关产品推荐

