Я раскручиваю легкие контейнеры на хосте Linux, используя LXD/LXC.
Единственной целью этих контейнеров является размещение «основных приложений Dotnet и Dotnet».
Некоторое время я использовал Ansible, но недавно обнаружил, что могу встроить скрипт инициализации в пользовательские данные конфигурации контейнера, и cloud-init выполнит его.
Это здорово, и позволяет мне настроить данный контейнер именно с теми пакетами, которые ему нужны, за исключением одной проблемы.
Майкрософт
(Знаю, знаю... приберегите шутки и оскорбления :-D)
В отличие от большинства сторонних поставщиков пакетов, MS упаковывает все добавление своего источника deb и ключа GPG в отдельный файл пакета dpkg, этот файл пакета не указан в обычных репозиториях, поэтому его в основном необходимо загрузить с помощью «wget», а затем установить. используя обычную команду dpkg.
Прямо сейчас, вот как я делаю вещи:
#cloud-config
# применить обновления с помощью apt
пакет_обновление: правда
package_upgrade: правда
# установить имя хоста
имя хоста: ****
полное доменное имя: ****
manage_etc_hosts: правда
# Установите репозитории сторонних программ
# ПРИМЕЧАНИЕ. Это делается с помощью команды запуска из-за того, что Microsoft распространяет вещи с помощью необработанного dpkg
выполнить команду:
- [wget, "https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb", -O, /root/packages-microsoft-prod.deb]
- dpkg -i /root/packages-microsoft-prod.deb
- rm /root/packages-microsoft-prod.deb
- удачное обновление
- apt-get установить dotnet-sdk-3.1 -y
- apt-get установить dotnet-sdk-5.0 -y
# Устанавливаем стандартные пакеты
пакеты:
- apt-транспорт-https
- питон3
- питон-это-питон3
- МС
- гнупг
- нгинкс
- мерзавец
# Добавить пользователей
пользователи:
- имя: ****
ssh-авторизованные ключи:
- ssh-rsa **** rsa-key-BLAH
судо: ['****']
группы: судо
оболочка: /bin/bash
финальное_сообщение:
- «Инициализация контейнера завершена».
Ключевой частью является раздел «runcmd».
Поскольку я использую «runcmd», он запускается ПОСЛЕ всего остального, включая обычную часть установки пакета, где я помещаю все стандартные пакеты, которые мне нужно использовать.
В идеале я ХОЧУ установить файл dpkg, а затем просто добавить имена пакетов для установки в обычную часть пакета, например
# Что-то здесь для загрузки и установки dpkg
# Устанавливаем стандартные пакеты
пакеты:
- apt-транспорт-https
- питон3
- питон-это-питон3
- МС
- гнупг
- нгинкс
- мерзавец
- dotnet-sdk-3.1
- dotnet-SDK-5.0
Я пытался ТОЛЬКО поместить этот бит в runcmd, но поскольку он выполняется как самый последний шаг, это приводит к сбою части пакетов из-за отсутствия установленного репо для dotnet.
Я также пытался использовать модуль «Apt», чтобы установить «microsoft-prod.list» в «/etc/apt/sources.list.d», но это также не удалось, потому что MS не публикует свой ключ GPG и добавление источника вызывает сбой при выполнении подходящего обновления из-за того, что он является ненадежным источником.
Я просмотрел документацию модуля для cloud-init и не могу найти ничего, что, по-видимому, предполагает загрузку и добавление обычного файла dpkg, поэтому я спрашиваю здесь :-)