(Por favor, note queessa questãoé sobre LXC 1.x, enquantoEsteé sobre LXC 2.x/LXD)
Eu vasculhei a web em busca de uma resposta para essa pergunta, mas não consegui encontrar nenhuma resposta razoavelmente não hackeada.
O que estou procurando é uma abordagem para moldar um modelo existente da maneira que eu gostaria. Em particular, o que procuro é personalizar a imagem de nuvem upstream do Ubuntu, fazendo várias alterações em seu FS raiz e adicionando/alterando configuração.
lxc launch ubuntu:lts CONTAINER
Portanto , minha abordagem atual é lxc exec CONTAINER -- ...
executar um script de minha autoria (depois de colocá-lo no contêiner) para executar minhas personalizações.
O que obtenho com essa abordagem é um contêiner razoavelmente personalizado. Infelizmente, há um problema. O contêiner neste ponto foi preparado cloud-init
e é uma instância de contêiner, não uma imagem/modelo.
Então é aqui que estou perdido agora. O que eu precisaria é transformar meu contêiner novamente em uma imagem (deve ser possível usando lxc publish
) e desfazer as alterações feitas nele cloud-init
ou pelo menos "cock" cloud-init
novamente para que seja acionado na próxima vez que a imagem for usada como fonte para lxc init
ou lxc launch
. Alternativamente, talvez haja uma maneira de desativar completamente cloud-init
quando eu lxc launch
sair da imagem upstream?
Existe uma maneira autorizada? Embora eu tenha examinado todos os tipos de documentação, incluindo oDocumentação Markdown no repositório LXDbem como a série de blogs de Stéphane Graber (líder do projeto LXD),especialmente [5/12], não consegui encontrar uma abordagem adequada. Talvez eu tenha perdido (ou seja, ficarei feliz em ler mais documentação se você souber alguma que descreva o que preciso).
A versão LXC usada é 2.20 (ou seja, estou usando o frontend LXD).
Responder1
No linkpágina [5/12]por Stéphane Graber, você pode encontrar uma segunda abordagem:
Construindo manualmente uma imagem
Construir sua própria imagem também é bastante simples.
- Gere um sistema de arquivos contêiner. Isso depende inteiramente da distribuição que você está usando. Para Ubuntu e Debian, seria usando debootstrap.
- Configure tudo o que for necessário para que a distribuição funcione corretamente em um contêiner (se algo for necessário).
- Faça um tarball desse sistema de arquivos contêiner e, opcionalmente, compacte-o.
- Escreva um novo arquivo metadata.yaml baseado no descrito acima.
- Crie outro tarball contendo esse arquivo metadata.yaml.
- Importe esses dois tarballs como uma imagem LXD com:
Dessa forma, você não precisa iniciar o contêiner antes de publicar a imagem. Você pode começar com uma imagem existente:
$ lxc image copy ubuntu:16.04/amd64 local: --alias ubuntu
$ mkdir export-directory
$ lxc image export ubuntu export-directory
$ cd export-directory
$ ls
5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.squashfs
meta-5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.tar.xz
$ mkdir meta squashfs
$ tar -xf *.tar.xz -D meta
$ sudo unsquashfs -f -d squash/ *squashfs
Agora você pode ajustar arquivos ou até mesmo fazer chroot no diretório squash. Então você pode tar os dois diretórios e importar a imagem ajustada com:
lxc image import <metadata tarball> <rootfs tarball> --alias my-adjusted-image
Responder2
A principal ferramenta para construção lxd
/ lxc
imagens éConstrutor de distribuição
A forma moderna de configurar imagens é comnuvem-init
Para personalizar imagens LXD/LXC, escrevi:
Uma interface de console python para o Distrobuilder (que incorpora ambos)
Segue ummetodologia semelhantepara Hashicorp Packer e cria modelos em camadas.
- Crie uma
base
imagem que substitua umstandard
modelo e inclua suasshell
e outras personalizações - Crie uma
custom
substituição de imagem com seus serviços da web, etc., que substitua suabase
imagem (ou seja, use obase
modelo de imagem comoSOURCE
modelo ao gerar ummodelo personalizadocom sua configuração de substituição de serviço personalizada/cloud-init)
Eu uso dbmenu
para construir contêineres LXD sem privilégios e adicionei (e pacote) um exemplo de configuração para criar:
- Imagens Alpine Linux / Ubuntu
base
com algumas personalizações - Ambiente de compilação Alpine Linux com
alpine-sdk
(ecloud-init
sendo removido na primeira inicialização) - Contêiner Ubuntu que instala o Gitlab na primeira inicialização (via cloud-init)
Eu também uso dbmenu
para criar uma imagem do Ubuntu adequada para executar rootless
podman / docker dentro lxd
(no momento da escrita ainda não adicionado aoexemplos)
OLeia-meestá bem completo agora
LXD do Ubuntu e o novo
incus
fork são suportados para construção de imagensVeja odependênciasnecessário por
dbmenu
. EmOutubro de 2023você precisa dagit
versão mais recentedistrobuilder
para criar o formato de modelo mais recenteNos bastidores
dbmenu
está o uso de Mike Farahyq
para mesclar osyaml
modelos (yq
&distrobuilder
são ambos escritos,Go
então ambos usam a mesmayaml
biblioteca subjacente)Usar
PyYaml
para mesclar foi problemático - ele lê e gravayaml
a configuração muito rapidamenteyaml.CSafeLoader
para leituradbmenu
a instalação é tão simples quanto:pipx install distrobuilder-menu
(pypi - versão mais recente)pipx install git+https://github.com/itoffshore/distrobuilder-menu.git
(github mais recentedev
/lançamento)