带有Systemd nspawn的容器
nspawn的Python项目详细描述
n黎明
带有^{
功能:
- 差分图像overlays
- 支持图像的多重继承
- 提供dsl
对于图像
build
和机器setup
- 机器是 completely represented 按生成 machine.service unit file
安装
安装python包:
sudo pip install nspawn
生成脚本
要构建映像,请提供并调用可执行的build.py
脚本,例如:
- 阿尔卑斯山:https://github.com/random-python/nspawn/blob/master/demo/alpine/base/build.py
- 执政官:https://github.com/random-python/nspawn/blob/master/demo/archux/base/build.py
- ubuntu:https://github.com/random-python/nspawn/blob/master/demo/ubuntu/base/build.py
对于可用的生成选项,请运行./build.py --help
设置脚本
要设置计算机,请提供并调用可执行的setup.py
脚本,例如:
- 阿尔卑斯山:https://github.com/random-python/nspawn/blob/master/demo/alpine/base/setup.py
- 执政官:https://github.com/random-python/nspawn/blob/master/demo/archux/base/setup.py
- ubuntu:https://github.com/random-python/nspawn/blob/master/demo/ubuntu/base/setup.py
有关可用的设置选项,请运行./setup.py --help
机器服务
要查看已设置、生成和正在运行的计算机服务,请运行:
machinectl
systemctl status <machine>
cat /etc/systemd/system/<machine>.service
例如,演示生成的服务:
- 阿尔卑斯山:https://github.com/random-python/nspawn/blob/master/demo/alpine-base.service
- 执政官:https://github.com/random-python/nspawn/blob/master/demo/archux-base.service
- ubuntu:https://github.com/random-python/nspawn/blob/master/demo/ubuntu-base.service
机器资源
机器文件和文件夹的位置:
/etc/systemd/system/<machine>.service
/var/lib/machines/<machine>
/var/lib/nspawn/runtime/<machine>
机器管理
要与实时计算机交互:
- 对于在
machinectl
注册的计算机
- 对于具有
systemd
init
的机器,例如archlinux
# start interactive shell:
sudo machinectl shell <machine>
# invoke command with args:
sudo machinectl shell <machine> /bin/command arg1 arg2 ...
- 对于未在
machinectl
注册的计算机
- 对于没有
systemd
init
的机器,例如alpine linux
# start interactive shell:
./setup.py --action=nsenter
- 或者,使用package provided
nspawn-enter
命令:
# start interactive shell:
nspawn-enter <machine>
# invoke command with args:
nspawn-enter <machine> "command arg1 arg2 ..."
配置
中描述了可用的配置选项 config.ini 文件。
使用config/path_list
选项控制配置覆盖文件列表。
图像服务器
包附带设置命令nspawn-hatch
它可以构建和设置本地http/https图像服务器。
# review available services:
nspawn-hatch list
# provision image server service:
nspawn-hatch update image-server
# verify image server machine status:
machinectl
图像服务器设置:
- https://github.com/random-python/nspawn/tree/master/src/main/nspawn/app/hatcher/service/image-server
建立DSL
build dsl用于build.py
,由from nspawn.build import *
激活,并提供关键字:
'TOOL',
'IMAGE',
'PULL',
'EXEC',
'WITH',
'FETCH',
'COPY',
'CAST',
'RUN',
'SH',
'PUSH',
设置DSL
setup dsl用于setup.py
,由from nspawn.setup import *
激活,并提供关键字:
'TOOL',
'IMAGE',
'MACHINE',
'WITH',
'EXEC',
'COPY',
'CAST',
'RUN',
'SH',
DSL语法
TOOL
公开生成/设置实用程序功能:
TOOL.<function>(...)
IMAGE()
声明图像标识:
IMAGE("http://host/path/package.tar.gz")
IMAGE(url="http://host/path/package.tar.gz")
PULL()
设置依赖关系映像:
PULL("http://host/path/package.tar.gz")
PULL(url="http://host/path/package.tar.gz")
EXEC()
声明图像入口点可执行文件,即COMMAND [ARGS...]
:
EXEC(['/usr/bin/env', 'sh', '-c', 'echo "hello-kitty"'])
EXEC(command=['/usr/bin/env', 'sh', '-c', 'echo "hello-kitty"'])
WITH()
使用nspawn容器设置自定义机器功能:
WITH(
SettingName1='setting 1 value a',
SettingName2='setting 2 value b',
...,
)
COPY()
复制本地资源:
- 在
build.py
中使用时:目标位于图像中 - 在
setup.py
中使用时:target在主机上
COPY("/etc")
COPY(path="/etc")
COPY(source="/root/input.md", target="/root/output.md")
CAST()
模板本地资源:
- 在
build.py
中使用时:目标位于图像中 - 在
setup.py
中使用时:target在主机上
CAST("/root/readme.md", variable="template varialbe", ...)
CAST(path="/root/readme.md", variable="template varialbe", ...)
CAST(source="/root/input.md", target="/root/output.md", variable="template varialbe", ...)
模板使用python/jinja 格式,即:
this template variable will be substituted: {{variable}}
FETCH()
下载并提取远程资源:
FETCH(
url="http://server/package.tar.gz", # url for remote resource
source="package-path", # relative path inside the package extract
target="/opt/resource", # absolute path inside the build image target
)
RUN()
调用命令,目标取决于上下文:
- 在
build.py
中使用时:在图像内部调用 - 在
setup.py
中使用时:在主机上调用
RUN(['/usr/bin/env', 'ls', '-las'])
RUN(command=['/usr/bin/env', 'ls', '-las'])
SH()
调用shell脚本,目标取决于上下文:
- 在
build.py
中使用时:在图像内部调用 - 在
setup.py
中使用时:在主机上调用
SH("ls -las")
SH(script="ls -las")
注意:
SH(script)
相当于RUN(command=['/usr/bin/env', 'sh', '-c', script])
PUSH()
将图像结果发布到声明的url:
PUSH()
MACHINE()
声明机器服务:
MACHINE('machine-name')
MACHINE(name='machine-name')
MACHINE(name='machine-name', template='/path/to/service/template/machine.service')
基于包提供的默认值设计自定义服务模板,例如乐:
- {A25}