Ubuntu PHP 存储库会过期吗?

Do Ubuntu PHP repositories expire?

免责声明:我对 linux、ubuntu、docker 等不是很熟悉。我只知道一些东西...


软件上下文:Ubuntu 16.04 + docker + docker-compose

我有一个 Docker 文件,其中还安装了 PHP 7.2:

FROM ubuntu:16.04
....
RUN LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get install -y --force-yes php7.2-bcmath php7.2-cli php7.2-common php7.2-curl \
                php7.2-cgi php7.2-dev php7.2-fpm php7.2-gd php7.2-gmp php7.2-imap php7.2-intl \
                php7.2-json php7.2-mbstring php7.2-mysql \
                php7.2-opcache php7.2-phpdbg php7.2-mongodb \
                php7.2-readline php7.2-recode \
                php7.2-tidy php7.2-xml php7.2-xsl php7.2-zip \
                && rm -rf /var/lib/apt/lists/*
....

我上次构建该镜像是 几周前并且它工作得很好,我从那个开始的容器图片表现符合预期。

我最近发现我还需要 PHP 的 SOAP 扩展(不要问为什么......),所以我只是在上面的列表中添加了扩展 php7.2-soap 并执行了以下操作:

docker-compose stop
docker-compose build <my_docker_service_name>

构建开始,下载一些东西后停止:

....
Get:112 http://archive.ubuntu.com/ubuntu xenial/main amd64 shtool all 2.0.8-8 [122 kB]
W: --force-yes is deprecated, use one of the options starting with --allow instead.
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/t/tzdata/tzdata_2018g-0ubuntu0.16.04_all.deb  404  Not Found [IP: 91.189.88.152 80]

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/l/linux/linux-libc-dev_4.4.0-140.166_amd64.deb  404  Not Found [IP: 91.189.88.152 80]

E: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-3+ubuntu16.04.1+deb.sury.org+3_amd64.deb  404  Not Found

E: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/o/openssl/libssl-dev_1.1.1-3+ubuntu16.04.1+deb.sury.org+3_amd64.deb  404  Not Found

E: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/p/php-defaults/php-common_68+ubuntu16.04.1+deb.sury.org+1_all.deb  404  Not Found

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
Fetched 57.5 MB in 43s (1331 kB/s)
ERROR: Service '<my_service_name>' failed to build: The command '/bin/sh -c apt-get install -y --force-yes php7.2 (....) && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 100

所以我对自己说,简单地添加 SOAP 扩展是行不通的。如果您转到 ppa:ondrej/php PPA 页面,您会发现它非常混乱,因为 Docker 成功安装的其他扩展未在此处列出。这就是为什么我认为将 SOAP 添加到列表中可能会起作用。

所以我从列表中删除了 php7.2-soap 扩展名,出于好奇,我再次尝试构建图像。而且...令人惊讶:它以完全相同的方式失败了。尽管 几周前它还运行良好


所以我的问题是:

1).知道如何在那里添加 SOAP 扩展吗?我正在考虑使用来自 DockerHub 的官方 PHP 图像,但很难让它与我的 Docker 文件中已有的其他东西一起工作,最著名的是 ngingx .

2).因为构建失败而没有更改 Docker 文件中的任何内容,这是否意味着我安装 PHP 的方式是 flawed/outdated 并且应该被替换?如果是,用什么?如果不是,为什么会这样?是因为一个简单的网络错误吗?或者可能是因为我使用的是 Ubuntu-16.04,我应该升级到 18.04 或类似版本?

Debian APT 系统引用了非常具体的软件包版本。如果包有任何类型的更新(错误修复、安全更新、描述文本中的拼写错误,...),它将使用新版本号重新发布,并从存储库中删除具有旧版本号的包。通常的解决方法是重新 运行 apt-get update.

看起来您的 Docker 文件执行此操作,但您可能被另一个 Docker 功能绊倒了。当你 运行 docker build 第二次时,Docker 说,“我已经 运行 这个输入图像上的这个命令并且知道它产生这个输出图像,所以我赢了再次运行”。如果像 apt-get update 这样上游内容确实发生了变化,那可能是个问题。

在这种特定情况下,通常的答案是始终在同一个 运行 命令中使用 运行 apt-get updateapt-get install。然后,如果您确实更改了已安装软件包的列表,Docker 将首先获得更新的软件包索引。

RUN apt-get update \
 && apt-get install -y ...

Docker 将在那个时间点创建已更改文件系统的缓存版本。

与现在可用的数据相比,之前 运行 的 apt-get update 命令的数据可能已过时。

docker build 只会在已更改的行之后构建一个回购协议(在本例中是您的 apt-get install 命令)。

像这样使用 --no-cache 标志尝试 运行ning docker build

docker-compose build --no-cache <my_docker_service_name>