创建 LXD 容器时如何传递 cloud-init 配置?

创建 LXD 容器时如何传递 cloud-init 配置?

我一直在阅读 LXD 文档、博客和 stackexchange 答案,它们说 LXD 应该具有某种 init 语法,允许您在创建容器时将云配置数据传递给容器,但许多示例对我都不起作用。我尝试过以下设置配置文件的示例、使用传递数据的示例--config、直接传递 yaml 数据的示例以及在 init 之后但在开始之前设置数据的示例。什么都没用。我正在粘贴我目前拥有的内容...有人能告诉我我做错了什么以及如何修复它吗?

我能想到的最基本的例子:

lxc delete -f x

cat << EOF >config.yml
#cloud-config
output: {all: '| tee -a /var/log/my-cloud-init-output.log'}
package_update: true
package_upgrade: true
package_reboot_if_required: true
packages:
  - tree
runcmd:
  - touch /run/cloud-config-did-run
EOF

lxc launch ubuntu: x --config=user.user-data="$(cat config.yml)"
sleep 5
lxc exec x -- bash -c "ls /run"
lxc exec x -- bash -c "tree /etc"

这应该输出到/var/log/my-cloud-init-output.log,安装树并在 /run 中创建一个空文件。输出到/var/log/my-cloud-init-output.log有效,但其他无效。日志没有显示任何特殊内容。

答案1

看来您需要等待更长时间。由于您已将package_updatepackage_upgrade指定为 true,因此在安装 tree 或执行 runcmd 之前,您实际上已经运行apt-get update; apt-get upgrade(这可能需要超过 5 秒钟)。

您的确切命令对我有用,如果我sleep 5

lxc exec x -- bash -c "cloud-init status --wait"
sleep 2  # because of the `package_reboot_if_required: true`

相关内容