Я хочу создать базовый образ Alpine, который извлекает ВСЕ ресурсы через мой внутренний Artifactory без моих сертификатов. Но подождите ... как я могу подключиться к своему внутреннему Artifactory без update-ca-certificates
? Получите ВСЕ альпийские ресурсы из Artifactory, без исключений.
Если в вашей компании нет ограничений на получение ресурсов из открытого Интернета, тогда все в порядке. В противном случае продолжайте читать.
Ужасная локальная проблема
У меня есть:
- Внутренний экземпляр GitLab
- Внутренний Artifactory (с удаленным репозиторием, указывающим на CDN Alpine)
- Внутренние самоподписанные сертификаты
Мои желания:
- Используйте
alpine
как базовое изображение с любой версией с тегами. - Добавьте мои внутренние сертификаты.
- Устанавливайте все зависимости и пакеты с помощью внутреннего экземпляра Artifactory только в соответствии с моей строгой политикой компании.
Решения там:
Большинство решений, с которыми я столкнулся, были связаны с копированием ваших сертификатов в изображение и простым запуском apk add ca-certificates && update-ca-certificates
. Это не работает, потому что мне нужно будет подключиться к Alpine CDN, чтобы получить CA-сертификаты; Это противоречит политике моей компании.
Я не могу изменить URL-адреса репозитория Artifactory до apk add
, потому что сертификаты не будут проверены.
Мои неудачные попытки:
В Apk есть команда fetch
, которая позволяет загрузить пакет без установки.
apk fetch ca-certificates
Цель заключалась в том, чтобы управлять версиями файла .apk и устанавливать его локально.
apk add --no-cache --no-network --repositories-file=/dev/null --allow-untrusted /tmp/ca-certificates-20190108-r0.apk
Проблема заключалась в том, что полученный пакет не соответствовал между версиями Alpine или, скорее, зависимостями (в частности, libcrypto). Пакет, загруженный из v3.10, не будет работать в v3.7.
Рабочий раствор
Поскольку apk add
не имеет параметра для указания сертификата, единственный способ - установить его как системный сертификат. Я бы обошелся без update-ca-certificates
. Я не буду углубляться в сценарий, я останусь на высоком уровне.
Во-первых, предполагается, что все ваши сертификаты находятся здесь: /usr/local/share/ca-certificates
. Выполните со своим сертификатом следующее:
update-ca-certificates grep -rnw -e "<insert your cert snippet>" /etc/ssl/certs/
update-ca-certificates
берет все действительные сертификаты из этого каталога и добавляет их в /etc/ssl/certs/ca-certificates.crt
. Это первая часть.
Затем делается 2 копии сертификата. Один на /etc/ssl/certs/ca-root-jack.pem
(мой сертификат был назван jack.crt), а другой с хешем /etc/ssl/certs/597c82bf.0
(я не понял, как этот хеш создается).
Затем нужно создать свой Dockerfile на основе собранной информации.
FROM alpine:3.1 COPY --from=git.local/internal-certs:latest /certs /usr/local/share/ca-certificates/ RUN cat /usr/local/share/ca-certificates/caroot-ROOT-CA.crt >> /etc/ssl/certs/ca-certificates.crt cp /usr/local/share/ca-certificates/caroot-ROOT-CA.crt /etc/ssl/certs/ca-cert-root.pem && \ cat /usr/local/share/ca-certificates/caroot-sna01_PAC-ROOT-CA.crt > /etc/ssl/certs/597c82bf.0 && \ sed -i -e 's/http:\/\/dl-cdn\.alpinelinux\.org/https:\/\/artifactory.local\/artifactory/g' /etc/apk/repositories && \ apk add --no-cache ca-certificates curl git && \ update-ca-certificates
Предложения
Не стесняйтесь писать DM или комментировать лучший маршрут, если он у вас есть. :)