Docker构建时从Debian源更新,无法安装PostgreSQL 9.5
核心问题出在哪?
其实这和你安装的Docker版本完全没关系!问题根源在你的Dockerfile第一行:FROM python:2.7这个基础镜像默认是基于Debian Stretch发行版构建的,所以容器内部的apt软件源自然是Debian的,而你要装的postgresql-client-9.5是Ubuntu Xenial专属的软件包,Debian Stretch的源里根本找不到它(Debian Stretch对应的postgresql-client版本是9.6),这就是为啥会报“没有安装候选”的错误。
几种可行的解决办法
你可以根据自己的需求选一个:
1. 切换到基于Ubuntu Xenial的Python镜像(最推荐)
直接把Dockerfile的第一行改成基于Ubuntu 16.04(Xenial)的Python 2.7镜像,这样容器里就会用Ubuntu的软件源,postgresql-client-9.5就能正常安装了:
FROM python:2.7-xenial
这个官方镜像就是专门为Ubuntu Xenial打造的,完美匹配你的环境需求。
2. 安装Debian Stretch兼容的postgresql-client版本
如果不想换基础镜像,也可以安装Debian Stretch源里有的postgresql-client 9.6版本,它和你的Postgres 9.5服务端完全兼容,功能上没影响:
RUN apt-get update && apt-get install -qq -y build-essential libpq-dev postgresql-client-9.6 --fix-missing --no-install-recommends
3. 不推荐:在Debian容器里混加Ubuntu源(风险高)
要是你铁了心要在Debian容器里装Ubuntu的包,也可以手动加Ubuntu Xenial的源,但这种跨发行版混源的做法很容易导致依赖冲突,后续出问题很难排查,实在不建议用。如果非要试,代码是这样:
RUN echo "deb http://archive.ubuntu.com/ubuntu xenial main universe" >> /etc/apt/sources.list.d/ubuntu.list && \ apt-get update && \ apt-get install -qq -y build-essential libpq-dev postgresql-client-9.5 --fix-missing --no-install-recommends
验证方法
改完Dockerfile之后,重新构建服务就行:
docker-compose build project1
如果用第一种方案,你会看到构建过程里的apt源变成Ubuntu Xenial的,postgresql-client-9.5也能顺利安装完成。
内容的提问来源于stack exchange,提问作者makkasi

