[lxc-users] Advice on LXC usage (python3 binding)
Journeyman
jman at storiepvtride.it
Wed May 11 23:27:13 UTC 2016
Hello,
I just started using LXC containers in Ubuntu Xenial, my background with
containers is with Docker, I'm trying to compare the two starting with a
minimal personal toy project.
I'm interested namely in scripting my container workflow using the LXC
Python3 binding, which is a great tool and I hope that it will become
more and more complete as LXC development advances.
Documentation is somewhat minimal, but the API is pretty straightforward
so I relied on a couple of tutorials by Stéphan Graber (thank you!) and
scripted a tool that creates and provision an LXC container for
continuous integration.
What this tool does is basically (using the Python API):
- lxc-create -t download
- lots of: container.attach_wait(lxc.attach_run_command, ['this',
'this_and_that']
- lots of: container.attach_wait(lxc.attach_run_command, ['start',
'service', 'x_and_y']
Example:
def provision_container(container_name):
def _configure_and_run_tests():
# ... BASH instructions to set ENV variables, then run tests
os.chdir('src_directory')
ret_code = call(['source', 'virtual/bin/activate'])
ret_code = call(['python', 'manage.py', 'tests'])
# export this and that ....
print("Tests returned {}: {}".format(ret_code)
container = lxc.Container(container_name)
start_container(container)
# install and configure stuff
container.attach_wait(lxc.attach_run_command,
["apt-get", "update"])
container.attach_wait(lxc.attach_run_command,
["apt-get", "dist-upgrade", "-y"])
container.attach_wait(lxc.attach_run_command,
['apt-get', 'install', '-qy', 'python-pip', 'python-dev'])
container.attach_wait(lxc.attach_run_command,
['pip', 'install', '--upgrade', '-q', 'pip'])
container.attach_wait(lxc.attach_run_command,
['pip', 'install', '--upgrade', '-q', 'virtualenv'])
container.attach_wait(lxc.attach_run_command,
['apt-get', 'install', '-qy', 'rabbitmq-server'])
# and so on ...
# start services
container.attach_wait(lxc.attach_run_command,
['sudo ', 'service', 'svcname', 'start'])
# etc...
container.attach_wait(_configure_and_run_tests)
I have a couple a questions:
- some instructions are one-liners (e.g. APT installs), others require
to "cd" into a dir, "export" variables and run other BASH commands
before executing the real task. When I have such composite instructions
- in the above example _configure_and_run_tests() - the only way I
understand to run a block of instructions atomically is creating a
subroutine and use it to run that block altogether. In this respect I
kind of miss the Docker recipe file that allows scripting (and caching)
every instruction without losing its context. Is there a cleaner way to
accomplish the above?
- Also I miss a repository like DockerHub to distribute and deploy my
containers around. If I want to distribute my LXC containers, currently
I can do that by means of a BASH script that basically packs the rootfs
and uploads it to a remote server. The destination server should
download the tar.gz, stop the container, unpack and restart.
Is there a better/cleaner way to accomplish this too?
Sorry for the lengthy email and thanks for any suggestion and comment; I
like LXC and I'm looking forward to seeing further development.
Regards,
Antonio
More information about the lxc-users
mailing list