Истекает ли срок действия репозиториев Ubuntu PHP? - PullRequest
0 голосов
/ 03 января 2019

Отказ от ответственности: я не очень хорошо знаком с Linux, Ubuntu, Docker и т. Д. Я знаю только некоторые вещи ...


Контекст программного обеспечения: Ubuntu 16.04 + docker + docker-compose

У меня есть Dockerfile, который, помимо прочего, также устанавливает 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 ppa: ondrej / php, вы увидите, что это очень запутанно, потому что другие расширения, успешно установленные Docker, там не перечислены.Вот почему я подумал, что добавление SOAP в список может сработать.

Поэтому я удалил расширение php7.2-soap из списка и из любопытства попытался создать изображение еще раз.И ... сюрприз: не удалось точно так же.Несмотря на то, что он отлично работал всего несколько недель назад .


Итак, мои вопросы:

1).Есть идеи, как добавить туда расширение SOAP?Я думал об использовании официального образа PHP из DockerHub, но может быть довольно трудно заставить его работать вместе с другими вещами, которые у меня уже есть в моем Dockerfile, особенно ngingx.

2).Поскольку сборка завершилась неудачно, ничего не изменив в Dockerfile, означает ли это, что мой способ установки PHP ошибочен / устарел и должен быть заменен?Если да, то чем?Если нет, то почему это происходит?Это из-за простой сетевой ошибки?Или, может быть, потому что я использую Ubuntu-16.04 и мне нужно обновиться до 18.04 или аналогичного?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Docker создаст кэшированную версию измененной файловой системы в тот момент времени.

Возможно, что команда apt-get update, которая была выполнена ранее, имела устаревшие данные по сравнению с тем, что доступно сейчас.

docker build будет создавать репо только после строк, которые были изменены (в этом случае ваши apt-get install команды).

Попробуйте запустить docker build с --no-cacheпометить так:

docker-compose build --no-cache <my_docker_service_name>
0 голосов
/ 03 января 2019

Система Debian APT ссылается на чрезвычайно специфические версии пакетов.Если есть какой-либо вид обновления пакета (исправление ошибки, обновление безопасности, орфографическая ошибка в тексте описания, ...), он переиздается с новым номером версии, а пакет со старым номером версии удаляется из хранилища.Обычное решение этой проблемы - перезапустить apt-get update.

Похоже, ваш Dockerfile делает это, но вы, вероятно, отключаетесь от одной другой функции Docker.Когда вы запускаете docker build во второй раз, Докер говорит: «Я уже выполнил эту команду для этого входного изображения и знаю, что он создает этот выходной образ, поэтому я не буду запускать его снова».Это может быть проблемой, если это что-то вроде apt-get update, где содержимое восходящего потока действительно изменяется.

Обычный ответ в этом конкретном случае - всегда запускать apt-get update и apt-get install в одной и той же команде RUN.Затем, если вы измените список установленных пакетов, Docker сначала получит обновленный индекс пакета.

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