我正在使用 LXD/LXC 在 Linux 主机上构建轻量级容器。
这些容器的唯一目的是托管“Dotnet 和 Dotnet 核心应用程序”
有一段时间我一直在使用 Ansible,但最近我发现我实际上可以将一个 init 脚本嵌入到容器配置的用户数据中,然后 cloud-init 会执行它。
这很棒,并且允许我设置一个给定的容器,其中包含它需要的包,除了一个问题。
微软
(我知道,我知道......保存笑话和诽谤:-D)
与大多数第 3 方软件包提供商不同,MS 将其全部添加的 deb 源和 GPG 密钥打包在一个独立的 dpkg 软件包文件中,该软件包文件未通过普通 repos 列出,因此基本上必须“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 的 repo。
我还尝试使用“Apt”模块,将“microsoft-prod.list”安装到“/etc/apt/sources.list.d”中,但这也失败了,因为 MS 没有发布他们的 GPG 密钥,另外由于它是不受信任的源,因此在执行 apt 更新时,源会导致失败。
我已经搜索了 cloud-init 的模块文档,但我找不到任何似乎表明可以下载和添加常规 dpkg 文件的内容,因此我在这里问:-)