Задача
Нужно подписывать docker-образы подписями, совместимыми с docker trust, однако без использования docker-демона (т.к. подписание происходит в CI/CD без доступа к демону).
Решение
Для формирвания подписи необходимо 2 инструмента:
- notary cli для формирования подписи и ее загрузки на notary-сервер
- skopeo для получения данных из манифеста подписываемого образа (умеет в т.ч. работать с докер-registry, а не только с локальным хранилищем образом, позволяя получать манифесты без pull'а самих образов)
# Если есть готовый docker-конфиг с учетками для авторизации в нужном docker registry,# то указываем его для skopeoexport REGISTRY_AUTH_FILE=$HOME/.docker/config.json# Вычислям хэш и размер манифеста докер-образаMANIFEST_HASH=`skopeo inspect --raw docker://$IMAGE_NAME:$IMAGE_VERSION | sha256sum`MANIFEST_HASH=${MANIFEST_HASH:0:64}MANIFEST_SIZE=`skopeo inspect --raw docker://$IMAGE_NAME:$IMAGE_VERSION | wc -c`# импортируем ключ для подписания из файла delegation.key (используемый рандомный passphrase)export NOTARY_DELEGATION_PASSPHRASE=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c10)notary key import ~/delegation.key -d ~/.docker/trust# собственно подписание и загрузка подписи на Notary-сервер (с debug-выводом)notary -D addhash -p $IMAGE_NAME $IMAGE_VERSION "$MANIFEST_SIZE" --sha256 "$MANIFEST_HASH" -r targets/releases -s https://my.notary.server -d ~/.docker/trust