<div dir="ltr">- for the composite instructions, write all those instructions in a temporary file, and execute it as a bash script inside the container.<div>- you can use s3 or self hosted <a href="http://minio.io">minio.io</a> or something else straight for storing container images. LXC itself is not repo aware, templates can abstract the logic of image repo, and you can use a custom template the gran images from s3 and expand them.</div><div>I use nut [1] to build LXC containers from Dockerfile. You can check out the source code for how this is achieved in golang. Note: LXD provides the publishing workflow as well.</div><div><br></div><div>[1]<a href="https://github.com/pagerduty/nut">https://github.com/pagerduty/nut</a></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 11, 2016 at 4:27 PM, Journeyman <span dir="ltr"><<a href="mailto:jman@storiepvtride.it" target="_blank">jman@storiepvtride.it</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
What this tool does is basically (using the Python API):<br>
- lxc-create -t download<br>
- lots of: container.attach_wait(lxc.attach_run_command, ['this', 'this_and_that']<br>
- lots of: container.attach_wait(lxc.attach_run_command, ['start', 'service', 'x_and_y']<br>
<br>
Example:<br>
<br>
def provision_container(container_name):<br>
<br>
    def _configure_and_run_tests():<br>
        # ... BASH instructions to set ENV variables, then run tests<br>
        os.chdir('src_directory')<br>
        ret_code = call(['source', 'virtual/bin/activate'])<br>
        ret_code = call(['python', 'manage.py', 'tests'])<br>
        # export this and that ....<br>
        print("Tests returned {}: {}".format(ret_code)<br>
<br>
    container = lxc.Container(container_name)<br>
    start_container(container)<br>
<br>
    # install and configure stuff<br>
    container.attach_wait(lxc.attach_run_command,<br>
        ["apt-get", "update"])<br>
    container.attach_wait(lxc.attach_run_command,<br>
        ["apt-get", "dist-upgrade", "-y"])<br>
    container.attach_wait(lxc.attach_run_command,<br>
        ['apt-get', 'install', '-qy', 'python-pip', 'python-dev'])<br>
    container.attach_wait(lxc.attach_run_command,<br>
        ['pip', 'install', '--upgrade', '-q', 'pip'])<br>
    container.attach_wait(lxc.attach_run_command,<br>
        ['pip', 'install', '--upgrade', '-q', 'virtualenv'])<br>
    container.attach_wait(lxc.attach_run_command,<br>
        ['apt-get', 'install', '-qy', 'rabbitmq-server'])<br>
    # and so on ...<br>
<br>
    # start services<br>
    container.attach_wait(lxc.attach_run_command,<br>
       ['sudo ', 'service', 'svcname', 'start'])<br>
    # etc...<br>
    container.attach_wait(_configure_and_run_tests)<br>
<br>
<br>
I have a couple a questions:<br>
<br>
- 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?<br>
<br>
- 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.<br>
Is there a better/cleaner way to accomplish this too?<br>
<br>
Sorry for the lengthy email and thanks for any suggestion and comment; I like LXC and I'm looking forward to seeing further development.<br>
<br>
Regards,<br>
Antonio<br>
_______________________________________________<br>
lxc-users mailing list<br>
<a href="mailto:lxc-users@lists.linuxcontainers.org" target="_blank">lxc-users@lists.linuxcontainers.org</a><br>
<a href="http://lists.linuxcontainers.org/listinfo/lxc-users" rel="noreferrer" target="_blank">http://lists.linuxcontainers.org/listinfo/lxc-users</a></blockquote></div><br></div>