. Я раскручивал легкие контейнеры на хосте Linux, используя LXD/LXC.
Единственной целью этих контейнеров является размещение «основных приложений Dotnet и Dotnet».
Некоторое время я использовал Ansible, но недавно обнаружил, что на самом деле могу встроить сценарий инициализации в пользовательские данные контейнера. контейнера, и cloud-init выполнит его.
Это здорово, и позволяет мне настроить данный контейнер с именно теми пакетами, которые ему нужны, за исключением одной проблемы.
Microsoft
(Я знаю, я знаю... оставь шутки и оскорбления :-D)
В отличие от большинства сторонних поставщиков пакетов, MS упаковывает все добавление своего источника deb и ключа GPG в отдельный dpkg package, этот файл пакета не указан в обычных репозиториях, поэтому его в основном необходимо загрузить с помощью wget, а затем установить с помощью обычной команды dpkg.
Прямо сейчас я делаю вот так.:
#cloud-config
# apply updates using apt
package_update: true
package_upgrade: true
# set hostname
hostname: ****
fqdn: ****
manage_etc_hosts: true
# Install 3rd party software repos
# NOTE: This is done using run command due to the way microsoft distribute things using a raw dpkg
runcmd:
- [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 update
- apt-get install dotnet-sdk-3.1 -y
- apt-get install dotnet-sdk-5.0 -y
# Install standard packages
packages:
- apt-transport-https
- python3
- python-is-python3
- mc
- gnupg
- nginx
- git
# Add users
users:
- name: ****
ssh-authorized-keys:
- ssh-rsa **** rsa-key-BLAH
sudo: ['****']
groups: sudo
shell: /bin/bash
final_message:
- "Container initialisation complete."
Ключевой частью является раздел «runcmd».
Поскольку я использую runcmd, он запускается ПОСЛЕ всего остального, включая обычную часть установки пакета, в которую я добавляю все стандартные пакеты, которые мне нужно использовать.
В идеале я ХОЧУ установить файл dpkg, а затем просто добавить имена пакетов для установки в часть обычного пакета, например
# Something here to download and install the dpkg
# Install standard packages
packages:
- apt-transport-https
- python3
- python-is-python3
- mc
- gnupg
- nginx
- git
- dotnet-sdk-3.1
- dotnet-sdk-5.0
Я пытался ТОЛЬКО поместить этот бит в runcmd, но поскольку он выполняется как самый последний шаг, он приводит к сбою части пакетов из-за отсутствия установленного репо для dotnet.
Я также пытался использовать модуль «Apt», чтобы установить «microsoft-prod.list» в «/etc/apt/sources.list.d», но это также не удалось, потому что MS не публикует свои GPG-ключ,и добавление источника вызывает сбой при выполнении подходящего обновления из-за того, что он является ненадежным источником.
Я просмотрел документацию модуля для cloud-init, и я не могу найти ничего, что, по-видимому, предполагает загрузку и добавление обычного файла dpkg, поэтому я спрашиваю здесь:-)