Вопрос или проблема
У меня проблема после обновления образа PHP с 8.0 до 8.1, и на Stack Overflow они отправили меня сюда
это мой Dockerfile:
FROM php:8.1-apache AS apache
RUN a2enmod rewrite
WORKDIR /bin
WORKDIR ../
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 F8D2585B8783D481 BDE6D2B9216EC7A8
RUN apt update \
&& apt install \
curl \
git \
unzip \
cron \
libzip-dev \
libcurl4-openssl-dev \
pkg-config \
libssl-dev \
libpng-dev \
libjpeg62-turbo-dev \
libicu-dev \
wget \
libcap2-bin \
procps \
-y \
&& setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2 \
&& chown www-data:www-data /var/log/apache2 \
&& wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb \
&& apt install -y ./wkhtmltox_0.12.6.1-3.bookworm_amd64.deb \
&& rm wkhtmltox_0.12.6.1-3.bookworm_amd64.deb \
&& apt-get clean autoclean \
&& apt-get autoremove --yes
и так далее...
Во время сборки образа у меня возникает ошибка;
[0mGet:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Err:1 http://deb.debian.org/debian bookworm InRelease
Следующие подписи не удалось проверить, потому что открытый ключ недоступен: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481
Err:2 http://deb.debian.org/debian bookworm-updates InRelease
Следующие подписи не удалось проверить, потому что открытый ключ недоступен: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131
Err:3 http://deb.debian.org/debian-security bookworm-security InRelease
Следующие подписи не удалось проверить, потому что открытый ключ недоступен: NO_PUBKEY 54404762BBB6E853 NO_PUBKEY BDE6D2B9216EC7A8
Если я добавляю строку:
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 F8D2585B8783D481 BDE6D2B9216EC7A8
Возникает ошибка:
[91mE: gnupg, gnupg2 и gnupg1, похоже, не установлены, но один из них необходим для этой операции
Если я добавляю установщик apt для gnupg в Dockerfile… возникает та же ошибка с открытыми ключами, поэтому я не могу его установить
Что мне делать?
Я не получаю ошибок отсутствующего ключа, когда пытаюсь ваш Dockerfile. Я удалил строку RUN apt-key ...
, и остальное просто работает. Возможно, php:8.1-apache
был с ошибками в тот момент, когда вы написали этот вопрос.
Поскольку трудно протестировать решение проблемы, которое невозможно воспроизвести, у меня есть только одно предложение: вы можете взять файлы ключей из работающей системы и просто скопировать их в образ (они должны быть в /etc/apt/trusted.gpg.d/
). Это должно вернуть apt в рабочее состояние.
Другие варианты, которые должны сработать:
-
Если у вас уже есть действительный локальный кэш доступных пакетов, вы можете просто (пере)установить пакет
debian-archive-keyring
, который содержит файлы. Но на новом образе Docker это вряд ли. -
Вы можете просто скачать
debian-archive-keyring
.deb файл с зеркала и установить его вручную.
Ответ или решение
Использование образа PHP 8.1 с Apache в Docker может вызвать проблемы с недоступностью публичных ключей, особенно если вы сталкиваетесь с сообщениями об ошибках, связанными с NO_PUBKEY
при выполнении команды apt update
. Это проблема может возникать после обновления до более новой версии образа. Давайте разберем, как ее решить.
Обзор проблемы
Вы получили ошибки, связанные с недоступностью публичных ключей, которые необходимы для верификации репозиториев Debian. Ваш Dockerfile включает команды для установки некоего программного обеспечения, но ошибка с недостающими ключами препятствует этому процессу.
Варианты решения
1. Удаление команды с apt-key
Прежде всего, возможно, вам не нужно использовать apt-key
. С новыми версиями Debian и Ubuntu рекомендуется использовать signed-by
в настройках вашего репозитория. Попробуйте удалить команду RUN apt-key adv ...
из вашего Dockerfile и добавьте следующую строку перед командой apt update
:
RUN echo "deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] http://deb.debian.org/debian/ bookworm main" > /etc/apt/sources.list.d/debian.list
2. Установка debian-archive-keyring
Если у вас по-прежнему возникают проблемы с ключами, вы можете установить пакет debian-archive-keyring
, который содержит нужные ключи:
RUN apt update && apt install -y debian-archive-keyring
Этот пакет должен предоставить необходимые ключи для верификации.
3. Установка GnuPG и добавление ключей вручную
Если по какой-то причине вам необходимо использовать apt-key
, вам нужно установить gnupg
перед его использованием. Добавьте следующую строку в ваш Dockerfile:
RUN apt update && apt install -y gnupg
После этого вы сможете использовать команду apt-key
:
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 F8D2585B8783D481 BDE6D2B9216EC7A8
4. Загрузка deb-пакета debian-archive-keyring вручную
Если предыдущие методы не работают, вы можете вручную загрузить и установить debian-archive-keyring
. Для этого добавьте строки, которые загружают пакет из Debian:
RUN wget http://deb.debian.org/debian/pool/main/d/debian-archive-keyring/debian-archive-keyring_2022.1_all.deb && \
dpkg -i debian-archive-keyring_2022.1_all.deb && \
rm debian-archive-keyring_2022.1_all.deb
Не забудьте проверить актуальную версию .deb
, которая вам нужна.
Итоговый Dockerfile
Ваш окончательный Dockerfile может выглядеть следующим образом:
FROM php:8.1-apache AS apache
RUN a2enmod rewrite
# Установите необходимые пакеты и ключи
RUN apt update && apt install -y gnupg wget && \
wget http://deb.debian.org/debian/pool/main/d/debian-archive-keyring/debian-archive-keyring_2022.1_all.deb && \
dpkg -i debian-archive-keyring_2022.1_all.deb && \
rm debian-archive-keyring_2022.1_all.deb
WORKDIR /bin
WORKDIR ../
RUN apt update && \
apt install -y \
curl \
git \
unzip \
cron \
libzip-dev \
libcurl4-openssl-dev \
pkg-config \
libssl-dev \
libpng-dev \
libjpeg62-turbo-dev \
libicu-dev \
wget \
libcap2-bin \
procps && \
setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2 && \
chown www-data:www-data /var/log/apache2 && \
wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb && \
apt install -y ./wkhtmltox_0.12.6.1-3.bookworm_amd64.deb && \
rm wkhtmltox_0.12.6.1-3.bookworm_amd64.deb && \
apt-get clean autoclean && \
apt-get autoremove --yes
Заключение
Эти шаги должны помочь вам решить проблемы с недостающими публичными ключами в процессе сборки Docker-образа. Следуйте указанным методам и адаптируйте Dockerfile по необходимости. Удачи!