Проблема с открытыми ключами apt при сборке образа Docker

Вопрос или проблема

У меня проблема после обновления образа 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 в рабочее состояние.

Другие варианты, которые должны сработать:

  1. Если у вас уже есть действительный локальный кэш доступных пакетов, вы можете просто (пере)установить пакет debian-archive-keyring, который содержит файлы. Но на новом образе Docker это вряд ли.

  2. Вы можете просто скачать 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 по необходимости. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...