<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>*scratch*</title>
    <link>https://www.scrivano.org/</link>
    <description>Recent content on *scratch*</description>
    <generator>Hugo -- 0.146.0</generator>
    <language>en</language>
    <lastBuildDate>Wed, 30 Apr 2025 16:12:00 +0200</lastBuildDate>
    <atom:link href="https://www.scrivano.org/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>GitChronicler: write commit messages with AI</title>
      <link>https://www.scrivano.org/posts/2025-04-30-git-chronicler/</link>
      <pubDate>Wed, 30 Apr 2025 16:12:00 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2025-04-30-git-chronicler/</guid>
      <description>&lt;p&gt;I started working on GitChronicler mostly to learn how I could
integrate AI into my workflow in a way that would actually spare me
doing boring stuff, like writing the git commit message.&lt;/p&gt;</description>
    </item>
    <item>
      <title>why do I have two /sys/fs/cgroup in my container</title>
      <link>https://www.scrivano.org/posts/2024-1-26-why-do-i-have-two-cgroup/</link>
      <pubDate>Fri, 26 Jan 2024 14:12:00 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2024-1-26-why-do-i-have-two-cgroup/</guid>
      <description>&lt;p&gt;it happened a few times in the past that users wonder why they see two
&lt;code&gt;/sys/fs/cgroup&lt;/code&gt; mounts in their unprivileged container.&lt;/p&gt;</description>
    </item>
    <item>
      <title>hide the current process executable file</title>
      <link>https://www.scrivano.org/posts/2022-12-21-hide-self-exe/</link>
      <pubDate>Wed, 21 Dec 2022 22:15:00 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2022-12-21-hide-self-exe/</guid>
      <description>&lt;p&gt;I have been working on a new functionality for the prctl syscall
utility that addresses a common security concern with container
runtimes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>the journey to speed up running OCI containers</title>
      <link>https://www.scrivano.org/posts/2022-10-21-the-journey-to-speed-up-oci-containers/</link>
      <pubDate>Wed, 21 Sep 2022 16:30:00 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2022-10-21-the-journey-to-speed-up-oci-containers/</guid>
      <description>&lt;p&gt;When I&amp;rsquo;ve started working on crun, I was looking at a faster way to
start up and stop containers by improving the OCI runtime, the
component in the OCI stack that is responsible to ultimately talk to
the kernel and setting the environment where the container runs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>an interesting issue handling the seccomp listener</title>
      <link>https://www.scrivano.org/posts/2022-09-05-seccomp-listener/</link>
      <pubDate>Mon, 05 Sep 2022 21:59:12 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2022-09-05-seccomp-listener/</guid>
      <description>&lt;p&gt;an interesting &lt;a href=&#34;https://github.com/containers/crun/issues/1002&#34;&gt;issue&lt;/a&gt; was opened for crun a couple of days ago.&lt;/p&gt;</description>
    </item>
    <item>
      <title>composefs - a file system for container images</title>
      <link>https://www.scrivano.org/posts/2021-10-26-compose-fs/</link>
      <pubDate>Tue, 26 Oct 2021 16:02:56 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2021-10-26-compose-fs/</guid>
      <description>&lt;p&gt;For the last couple of weeks, I&amp;rsquo;ve been playing on PoC implementation of a file system for the Linux kernel.&lt;/p&gt;</description>
    </item>
    <item>
      <title>seccomp made easy</title>
      <link>https://www.scrivano.org/posts/2021-01-30-easyseccomp/</link>
      <pubDate>Sat, 30 Jan 2021 21:10:14 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2021-01-30-easyseccomp/</guid>
      <description>&lt;p&gt;seccomp is a kernel feature that restricts what syscalls can be used
by a process.&lt;/p&gt;
&lt;p&gt;Almost every container runs with seccomp enabled to restrict its
access to syscalls.&lt;/p&gt;</description>
    </item>
    <item>
      <title>cgroup v2 OOM group</title>
      <link>https://www.scrivano.org/posts/2020-08-14-oom-group/</link>
      <pubDate>Fri, 14 Aug 2020 19:49:32 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2020-08-14-oom-group/</guid>
      <description>&lt;p&gt;One annoying issue with setting a memory limit for a container is that
the OOM killer kernel process can leave the container in an
inconsistent state with only some processes terminated.&lt;/p&gt;</description>
    </item>
    <item>
      <title>playing with seccomp notifications in the OCI runtime</title>
      <link>https://www.scrivano.org/posts/2020-08-10-seccomp-notifications/</link>
      <pubDate>Mon, 10 Aug 2020 10:40:19 +0200</pubDate>
      <guid>https://www.scrivano.org/posts/2020-08-10-seccomp-notifications/</guid>
      <description>&lt;p&gt;A couple weekends ago I&amp;rsquo;ve played with seccomp user notifications and
how they can be used in the OCI containers stack.&lt;/p&gt;
&lt;p&gt;Seccomp user notifications are a powerful Linux kernel feature, that
delegates syscalls handling to a userland program.&lt;/p&gt;</description>
    </item>
    <item>
      <title>avoid a memory page allocation on mount(2)</title>
      <link>https://www.scrivano.org/2019/12/27/avoid-a-memory-page-allocation-on-mount/</link>
      <pubDate>Fri, 27 Dec 2019 16:16:33 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/12/27/avoid-a-memory-page-allocation-on-mount/</guid>
      <description>&lt;p&gt;While working on crun, I got surprised by how much time the kernel
spent in the &lt;code&gt;copy_mount_options&lt;/code&gt; function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>run containers without pulling images</title>
      <link>https://www.scrivano.org/2019/10/24/run-containers-without-pulling-images/</link>
      <pubDate>Thu, 24 Oct 2019 18:37:23 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/10/24/run-containers-without-pulling-images/</guid>
      <description>&lt;p&gt;CRFS is a Google project that aims at running a container without pre-pulling the image first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>crun moved to github.com/containers</title>
      <link>https://www.scrivano.org/2019/08/12/crun-moved-to-github-com-containers/</link>
      <pubDate>Mon, 12 Aug 2019 09:54:25 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/08/12/crun-moved-to-github-com-containers/</guid>
      <description>&lt;p&gt;the giuseppe/crun github project was moved under &lt;a href=&#34;https://github.com/containers/crun&#34;&gt;https://github.com/containers/crun&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Similarly libocispec, used internally by crun for parsing the OCI configuration file was moved to &lt;a href=&#34;https://github.com/containers/libocispec&#34;&gt;https://github.com/containers/libocispec&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>rootless resources management with Podman on Fedora 30</title>
      <link>https://www.scrivano.org/2019/05/12/rootless-resources-management-with-podman-on-fedora-30/</link>
      <pubDate>Sun, 12 May 2019 20:36:59 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/05/12/rootless-resources-management-with-podman-on-fedora-30/</guid>
      <description>&lt;p&gt;I have finally opened some PRs for conmon and libpod that enable resources management for Podman rootless containers on Fedora 30 when using crun.&lt;/p&gt;</description>
    </item>
    <item>
      <title>resources management with rootless containers and cgroups v2</title>
      <link>https://www.scrivano.org/2019/02/26/resources-management-with-rootless-containers/</link>
      <pubDate>Tue, 26 Feb 2019 21:22:10 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/02/26/resources-management-with-rootless-containers/</guid>
      <description>&lt;p&gt;cgroups v2 will finally allow unprivileged users to manage a cgroup hierarchy in a safe manner without requiring any additional permission.&lt;/p&gt;</description>
    </item>
    <item>
      <title>rootless containers @ devconf.cz</title>
      <link>https://www.scrivano.org/2019/02/24/rootless-containers-devconf-cz/</link>
      <pubDate>Sun, 24 Feb 2019 22:26:15 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/02/24/rootless-containers-devconf-cz/</guid>
      <description>&lt;p&gt;The video is finally available on YouTube.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=jMOHfCw0DV8&#34;&gt;https://www.youtube.com/watch?v=jMOHfCw0DV8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in the slides, they are available here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.slideshare.net/AkihiroSuda/rootless-containers&#34;&gt;https://www.slideshare.net/AkihiroSuda/rootless-containers&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>SUID binaries from a user namespace</title>
      <link>https://www.scrivano.org/2019/01/10/suid-binaries-from-a-user-namespace/</link>
      <pubDate>Thu, 10 Jan 2019 21:49:30 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/01/10/suid-binaries-from-a-user-namespace/</guid>
      <description>&lt;p&gt;Additional IDs that are allocated to a user through /etc/subuid and /etc/subgid must be considered as permanently allocated and never reused for any other user.&lt;/p&gt;
&lt;p&gt;Even if the container/user namespace where they are used is destroyed, it is possible to forge a SUID binary that will keep access to any ID present in the user namespace.&lt;/p&gt;
&lt;p&gt;This simple C program is enough to keep access to an UID that was allocated to a user namespace:&lt;/p&gt;</description>
    </item>
    <item>
      <title>disposable rootless sessions</title>
      <link>https://www.scrivano.org/2019/01/09/disposable-rootless-sessions/</link>
      <pubDate>Wed, 09 Jan 2019 22:01:08 +0000</pubDate>
      <guid>https://www.scrivano.org/2019/01/09/disposable-rootless-sessions/</guid>
      <description>&lt;p&gt;would be nice to have a way to “fork” the current session and be able to revert all the changes done, without any leftover on the file system.&lt;/p&gt;
&lt;p&gt;Playing with fuse-overlayfs, a FUSE implementation of the overlay file system and thus usable by rootless users, I realized how that is so easy to achieve, just by setting the overlay lowerdir to ‘/’ and using a temporary directory for the upper dir.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An Emacs mode for rust</title>
      <link>https://www.scrivano.org/2018/12/18/an-emacs-mode-for-rust/</link>
      <pubDate>Tue, 18 Dec 2018 20:57:11 +0000</pubDate>
      <guid>https://www.scrivano.org/2018/12/18/an-emacs-mode-for-rust/</guid>
      <description>&lt;p&gt;I was looking for an Emacs mode that could help me to hack on rust.&lt;/p&gt;
&lt;p&gt;Rust-mode itself has not enough features to help me with a language I am not really proficient with yet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>rootless podman from upstream on Centos 7</title>
      <link>https://www.scrivano.org/2018/10/12/rootless-podman-from-upstream-on-centos-7/</link>
      <pubDate>Fri, 12 Oct 2018 09:14:21 +0000</pubDate>
      <guid>https://www.scrivano.org/2018/10/12/rootless-podman-from-upstream-on-centos-7/</guid>
      <description>&lt;p&gt;this is the recipe I use to build podman from upstream on Centos 7 and use rootless containers. We need an updated version of the shadow utils as newuidmap and newgidmap are not present on Centos 7. Using make install is not the correct way to install packages, and it will also overwrite existing The shadow utils are installed using “make install” which is not the clean way to install packages and it also overwrite the existing binaries, but it is fine on a development system. Podman is already present on Centos 7 and in facts we install it so we don’t have to worry about conmon and other dependencies.&lt;/p&gt;</description>
    </item>
    <item>
      <title>network namespaces for unprivileged users</title>
      <link>https://www.scrivano.org/2018/08/05/network-namespaces-for-unprivileged-users/</link>
      <pubDate>Sun, 05 Aug 2018 13:54:44 +0000</pubDate>
      <guid>https://www.scrivano.org/2018/08/05/network-namespaces-for-unprivileged-users/</guid>
      <description>&lt;p&gt;a couple of weekends ago I’ve played with libslirp and put together &lt;a href=&#34;https://github.com/giuseppe/slirp-forwarder&#34;&gt;slirp-forwarder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SliRP emulates in userspace a TCP/IP stack. It can be used to circumvent the limitation of creating TAP/TUN devices in the host namespace for an unprivileged user. The program could run in the host namespace, receive messages from the network namespace where a TAP device is configured, and forward them to the outside world using unprivileged operations such as opening another connection to the destination host. Privileged operations are still not possible outside of the emulated network, as the helper program doesn’t gain any additional privilege that running as an unprivileged user.&lt;/p&gt;</description>
    </item>
    <item>
      <title>become-root in an user namespace</title>
      <link>https://www.scrivano.org/2018/07/19/become-root-in-an-user-namespace/</link>
      <pubDate>Thu, 19 Jul 2018 08:28:06 +0000</pubDate>
      <guid>https://www.scrivano.org/2018/07/19/become-root-in-an-user-namespace/</guid>
      <description>&lt;p&gt;I’ve cleaned up some C files I was using locally for hacking with user namespaces and uploaded them to a new repository on github: &lt;a href=&#34;https://github.com/giuseppe/become-root&#34;&gt;https://github.com/giuseppe/become-root&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Creating an user namespace can be easily done with &lt;em&gt;unshare(1)&lt;/em&gt; and get the current user mapped to root with &lt;em&gt;unshare -r COMMAND&lt;/em&gt; but it doesn’t support the mapping of multiple uids/gids. For doing that it is necessary to use the suid newuidmap and newgidmap tools, that allocates multiple uids/gids to unprivileged users accordingly to the configuration files:&lt;/p&gt;</description>
    </item>
    <item>
      <title>fuse-overlayfs moved to github.com/containers</title>
      <link>https://www.scrivano.org/2018/07/13/fuse-overlayfs-moved-to-github-com-containers/</link>
      <pubDate>Fri, 13 Jul 2018 22:00:59 +0000</pubDate>
      <guid>https://www.scrivano.org/2018/07/13/fuse-overlayfs-moved-to-github-com-containers/</guid>
      <description>&lt;p&gt;The project I was working on in the last weeks was moved under the &lt;a href=&#34;https://github.com/containers&#34;&gt;github.com/containers&lt;/a&gt; umbrella.&lt;/p&gt;
&lt;p&gt;With Linux 4.18 it will be possible to mount a FUSE file system in an user namespace. fuse-overlayfs is an implementation in user space of the overlay file system already present in the Linux kernel, but that can be mounted only by the root user. Union file systems were around for a long time, allowing multiple layers to be stacked on top of each other where usually the last one is the only writeable.&lt;br&gt;
Overlay is an union file system widely used for mounting OCI image. Each OCI image is made up of different layers, each layer can be used by different images. A list of layers, stacked on each other gives the final image that is used by a container. The last level, that is writeable, is specific for the container. This model enables different containers to use the same image that is accessible as read-only from the lower layers of the overlay file system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Current status (and problems) of running Buildah as non root</title>
      <link>https://www.scrivano.org/2018/02/25/current-status-problems-running-buildah-non-root/</link>
      <pubDate>Sun, 25 Feb 2018 13:59:14 +0000</pubDate>
      <guid>https://www.scrivano.org/2018/02/25/current-status-problems-running-buildah-non-root/</guid>
      <description>&lt;p&gt;Having Buildah running in an user namespace opens the possibility of building container images as a not root user. I’ve done some work to get &lt;a href=&#34;https://github.com/projectatomic/buildah&#34;&gt;Buildah&lt;/a&gt; running in an user container.&lt;/p&gt;
&lt;p&gt;There are still some open issues to get it fully working. The biggest open one is that &lt;em&gt;overlayfs&lt;/em&gt; cannot be currently used as non root user. There is some work going on, but this will require changes in the kernel and the way extended attributes work for overlay. The alternative is far from ideal and it is to use the &lt;em&gt;vfs&lt;/em&gt; storage driver, but it is a good starting point to get things moving and see how far we get. (Another possibility that doesn’t require changes in the kernel would be an OSTree storage for Buildah, but that is a different story).&lt;/p&gt;</description>
    </item>
    <item>
      <title>New COPR repository for crun</title>
      <link>https://www.scrivano.org/2017/11/15/new-copr-repository-crun/</link>
      <pubDate>Wed, 15 Nov 2017 19:25:46 +0000</pubDate>
      <guid>https://www.scrivano.org/2017/11/15/new-copr-repository-crun/</guid>
      <description>&lt;p&gt;I made a new COPR repository for CRUN so that it can be easily tested on Fedora:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://copr.fedorainfracloud.org/coprs/gscrivano/crun/&#34;&gt;https://copr.fedorainfracloud.org/coprs/gscrivano/crun/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To install crun on Fedora, it is enough to:&lt;/p&gt;



&lt;div class=&#34;goat svg-container &#34;&gt;
  
    &lt;svg
      xmlns=&#34;http://www.w3.org/2000/svg&#34;
      font-family=&#34;Menlo,Lucida Console,monospace&#34;
      
        viewBox=&#34;0 0 288 57&#34;
      &gt;
      &lt;g transform=&#39;translate(8,16)&#39;&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;#&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;#&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;0&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;#&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;16&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;24&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;f&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;f&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;32&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;f&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;48&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;y&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;56&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;64&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;72&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;t&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;80&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;p&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;88&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;96&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#39;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;112&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;120&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;y&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;128&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;f&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;b&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;136&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;-&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;l&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;144&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;e&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;152&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;160&#39; y=&#39;36&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;168&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;g&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;m&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;176&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;s&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;184&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;192&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;d&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;200&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;i&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;(&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;208&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;v&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;216&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;a&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;224&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;p&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;232&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;o&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;240&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;240&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;/&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;)&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;248&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;c&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;256&#39; y=&#39;4&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;&#39;&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;256&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;r&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;264&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;u&lt;/text&gt;
&lt;text text-anchor=&#39;middle&#39; x=&#39;272&#39; y=&#39;20&#39; fill=&#39;currentColor&#39; style=&#39;font-size:1em&#39;&gt;n&lt;/text&gt;
&lt;/g&gt;

    &lt;/svg&gt;
  
&lt;/div&gt;
&lt;p&gt;a recent change in the &lt;a href=&#34;https://github.com/projectatomic/atomic/&#34;&gt;atomic&lt;/a&gt; tool, which didn’t still get into a release, allows to easily override the OCI runtime for system containers. Assuming you are using atomic from the upstream repository, you can use crun as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>C is a better fit for tools like an OCI runtime</title>
      <link>https://www.scrivano.org/2017/10/23/c-still-makes-sense-low-level-tools-oci-runtime/</link>
      <pubDate>Mon, 23 Oct 2017 21:21:19 +0000</pubDate>
      <guid>https://www.scrivano.org/2017/10/23/c-still-makes-sense-low-level-tools-oci-runtime/</guid>
      <description>&lt;p&gt;I’ve spent some of the last weeks working on a replacement for runC, the most used/known OCI runtime for running containers. It might not be very well known, but it is a key component for running containers. Every Docker container ultimately runs through runC.&lt;/p&gt;
&lt;p&gt;Having containers running through some common specs allow some pieces to be replaced without having any difference in behavior.&lt;/p&gt;
&lt;p&gt;The OCI runtime specs describe how a container looks like once it is running, for instance it lists all the mount points, the capabilities left to the process, the process that must be executed, the namespaces to create and so on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenShift on system containers</title>
      <link>https://www.scrivano.org/2017/02/23/openshift-system-containers/</link>
      <pubDate>Thu, 23 Feb 2017 18:26:43 +0000</pubDate>
      <guid>https://www.scrivano.org/2017/02/23/openshift-system-containers/</guid>
      <description>&lt;p&gt;It is still an ongoing work not ready for production, but the upstream
version of OpenShift origin has already an experimental support for
running OpenShift Origin using system containers. The
“latest” Docker image for origin, node and openvswitch,
the 3 components we need, are automatically pushed to docker.io, so we
can use these for our test. The rhel7/etcd system container image
instead is pulled from the Red Hat registry.&lt;/p&gt;
&lt;p&gt;This demo is based on these blog posts
&lt;a href=&#34;http://www.projectatomic.io/blog/2016/12/part1-install-origin-on-f25-atomic-host/&#34;&gt;www.projectatomic.io/blog/2016/12/part1-install-origin-on-f25-atomic-host/&lt;/a&gt;
and
&lt;a href=&#34;http://www.projectatomic.io/blog/2016/12/part2-install-origin-on-f25-atomic-host/&#34;&gt;www.projectatomic.io/blog/2016/12/part2-install-origin-on-f25-atomic-host/&lt;/a&gt;
with some differences for the provision of the VMs and obviously
running system containers instead of Docker containers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>System containers presentation </title>
      <link>https://www.scrivano.org/2017/01/30/system-containers-presentation/</link>
      <pubDate>Mon, 30 Jan 2017 18:41:37 +0000</pubDate>
      <guid>https://www.scrivano.org/2017/01/30/system-containers-presentation/</guid>
      <description>&lt;p&gt;Here the slides for the Atomic System Containers talk I gave at Devconf.cz 2017:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://scrivano.org/static/system-containers-demo/&#34;&gt;http://scrivano.org/static/system-containers-demo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in the video, it is on YouTube:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=yQZiRWWEPYo&#34;&gt;https://www.youtube.com/watch?v=yQZiRWWEPYo&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Facebook detox? </title>
      <link>https://www.scrivano.org/2016/12/27/facebook-detox/</link>
      <pubDate>Tue, 27 Dec 2016 20:52:47 +0000</pubDate>
      <guid>https://www.scrivano.org/2016/12/27/facebook-detox/</guid>
      <description>&lt;p&gt;I have been using Facebook for the last years to fill every dead time:waiting for the bus, ads on TV, compiling, etc.  The quality of the information coming from Facebook is inferior to any other social network, at least to my experience (it can be I follow/know the wrong people), though the part of the brain that controls procrastination seems addicted to this lower quality information and the chattering there.  Also, I don’t want to simply delete my Facebook account and move on, most of the people I know are present only there, neither I want to be more “asocial”.&lt;/p&gt;</description>
    </item>
    <item>
      <title>use bubblewrap as an unprivileged user to run systemd images</title>
      <link>https://www.scrivano.org/2016/10/22/use-bubblewrap-unprivileged-user-run-systemd-images/</link>
      <pubDate>Sat, 22 Oct 2016 13:21:25 +0000</pubDate>
      <guid>https://www.scrivano.org/2016/10/22/use-bubblewrap-unprivileged-user-run-systemd-images/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/projectatomic/bubblewrap/&#34;&gt;bubblewrap&lt;/a&gt; is a sandboxing tool that allows unprivileged users to run containers. I was recently working on a way to allow unprivileged users, to take advantage of bubblewrap to run regular system images that are using systemd. To do so, it was necessary to modify bubblewrap to keep some capabilities in the sandbox.&lt;/p&gt;
&lt;p&gt;Capabilities are the way, since Linux 2.2, that the kernel uses to split the root power into a finer grained set of permissions that each thread can have. Together with Linux &lt;a href=&#34;http://man7.org/linux/man-pages/man7/namespaces.7.html&#34;&gt;namespaces&lt;/a&gt; it is fine to leave unprivileged users the possibility to use some of them. To give an example, &lt;strong&gt;CAP_SETUID&lt;/strong&gt;, which allows the calling process to make manipulations of process UIDs, is fine to be used in a new user namespace as the set of permitted UIDs is restricted to those UIDs that exist in the new user namespace.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brainfuc**d brainf**k</title>
      <link>https://www.scrivano.org/2016/05/11/brainfucd-brainfk/</link>
      <pubDate>Wed, 11 May 2016 21:15:43 +0000</pubDate>
      <guid>https://www.scrivano.org/2016/05/11/brainfucd-brainfk/</guid>
      <description>&lt;p&gt;Every programmer at some point gets in touch with the Brainfuck programming language and how surprising is that very few instructions are needed to have a Turing complete language, 6 is the case of Brainfuck (plus other 2 for I/O operations).&lt;/p&gt;
&lt;p&gt;I have recently found an old project of mine that I have used to learn how to write a GCC frontend, it took a while to adapt it to work with a newer GCC version. The code is available on &lt;a href=&#34;https://github.com/giuseppe/gccbrainfuck&#34;&gt;github&lt;/a&gt;. The only positive side of this project, if any, is that it can be easily used as a starting point on how to add a frontend to GCC, or in this case, to compile a Brainfuck interpreter written in Brainfuck!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Refactoring a function name across several patches with git rebase</title>
      <link>https://www.scrivano.org/2016/04/22/rename-symbol-across-several-git-patches/</link>
      <pubDate>Fri, 22 Apr 2016 17:32:23 +0000</pubDate>
      <guid>https://www.scrivano.org/2016/04/22/rename-symbol-across-several-git-patches/</guid>
      <description>&lt;p&gt;&lt;em&gt;git rebase&lt;/em&gt; is one of my favorite git commands. It allows to update a set of local patches against another git branch and also to rework, trough the &lt;em&gt;-i&lt;/em&gt; flag some previous patches.&lt;/p&gt;
&lt;p&gt;The problem I had to deal with was quite simple, rename a function called &lt;strong&gt;notProperPythonCode&lt;/strong&gt; to &lt;strong&gt;proper_python&lt;/strong&gt; that was defined in the first patch and be sure that all other patches are using the correct name. The &lt;em&gt;–exec&lt;/em&gt; flag allows to run a custom script after each patch is applied, so that I could run &lt;em&gt;sed&lt;/em&gt; to process the Python files and replace the old function name with the new one. The process is quite simple, except that such changes would trigger a lot of merge conflicts, trivial to solve but quite annoying.&lt;br&gt;
Fortunately git rebase allows to choose what merge strategy must be adopted for solving conflicts, the &lt;em&gt;theirs&lt;/em&gt; strategy in case of a conflict, will take the previous version of the patch and silently use it. That is fine for this simple substitution case, where we process each file ending by &lt;em&gt;*.py&lt;/em&gt; in the repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>System containers for Atomic</title>
      <link>https://www.scrivano.org/2016/03/24/system-containers-for-atomic/</link>
      <pubDate>Thu, 24 Mar 2016 15:41:50 +0000</pubDate>
      <guid>https://www.scrivano.org/2016/03/24/system-containers-for-atomic/</guid>
      <description>&lt;p&gt;The main reason behind system containers was the inability to run Flannel in a Docker container as Flannel is required by Docker itself. CoreOS solved this chicken and egg problem by using another instance of Docker (called early-docker) that is used to setup only Etcd and Flannel.&lt;/p&gt;
&lt;p&gt;Differently, Atomic system containers will be managed by &lt;a href=&#34;https://github.com/opencontainers/runc&#34;&gt;runc&lt;/a&gt; and systemd.&lt;/p&gt;
&lt;p&gt;The container images, even though being served through the Docker v2 registry, are slighty different than a regular Docker container in order to be used by Atomic. The installer expects that some files are present in the container rootfs under &lt;em&gt;/exports&lt;/em&gt;, the OCI spec file for running the Runc container and the unit file for Systemd. Both these files are templates and some values are replaced by the installer.&lt;br&gt;
The communication with the Docker registry is done through &lt;a href=&#34;https://github.com/projectatomic/skopeo&#34;&gt;Skopeo&lt;/a&gt;, that is used internally by the atomic cli tool.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ostree-docker-builder</title>
      <link>https://www.scrivano.org/2015/09/30/ostree-docker-builder/</link>
      <pubDate>Wed, 30 Sep 2015 13:25:56 +0000</pubDate>
      <guid>https://www.scrivano.org/2015/09/30/ostree-docker-builder/</guid>
      <description>&lt;p&gt;rpm-ostree, used together with OStree, is a powerful tool to generate immutable images for .rpm based systems, why not to use it for generating Docker images as well?&lt;/p&gt;
&lt;p&gt;rpm-ostree already supports the generation of a Docker container tree, that can be feed to Docker almost as it is; ostree-docker-builder instead is a new tool to make this task simpler.&lt;/p&gt;
&lt;p&gt;The following JSON description is enough to create an Emacs container using &lt;em&gt;rpm-ostree&lt;/em&gt; based on Fedora-22.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Summer of Code 2015 for wget</title>
      <link>https://www.scrivano.org/2015/04/30/summer-of-code-2015-wget/</link>
      <pubDate>Thu, 30 Apr 2015 21:40:25 +0000</pubDate>
      <guid>https://www.scrivano.org/2015/04/30/summer-of-code-2015-wget/</guid>
      <description>&lt;p&gt;coming as a surprise, this year we have got 4 students to work full-time during the summer on wget. More than all the students who have ever worked for wget before during a Summer of Code!&lt;/p&gt;
&lt;p&gt;The accepted projects cover different areas: security, testing, new protocols and some speed-up optimizations. Our hope is that we will be able to use the new pieces as soon as possible, this is why we ask students to keep their code always rebased on top of the current wget development version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create a QCOW2 image for Fedora 22 Atomic</title>
      <link>https://www.scrivano.org/2015/04/20/create-a-qcow2-image-for-fedora-22-atomic/</link>
      <pubDate>Mon, 20 Apr 2015 15:50:30 +0000</pubDate>
      <guid>https://www.scrivano.org/2015/04/20/create-a-qcow2-image-for-fedora-22-atomic/</guid>
      <description>&lt;p&gt;This tutorial shows how to create a QCOW2 image that can directly imported via virt-install to test out Fedora 22 Atomic starting from a custom OStree repo.&lt;/p&gt;
&lt;p&gt;To create the image, we are going to use both &lt;a href=&#34;https://github.com/projectatomic/rpm-ostree/&#34; title=&#34;rpm-ostree&#34;&gt;rpm-ostree&lt;/a&gt; and &lt;a href=&#34;https://github.com/projectatomic/rpm-ostree-toolbox&#34; title=&#34;rpm-ostree-toolbox&#34;&gt;rpm-ostree-toolbox&lt;/a&gt;. Ensure they are installed as well as Docker, libvirtd and Vagrant-libvirt.&lt;/p&gt;
&lt;p&gt;The first phase consists in generating the OStree repo that is going to be used by the image. We can use directly the files from the &lt;em&gt;fedora-atomic&lt;/em&gt; project as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to deploy a WordPress Docker container using docker-compose</title>
      <link>https://www.scrivano.org/2015/04/19/wordpress-in-a-docker-container/</link>
      <pubDate>Sun, 19 Apr 2015 23:25:49 +0000</pubDate>
      <guid>https://www.scrivano.org/2015/04/19/wordpress-in-a-docker-container/</guid>
      <description>&lt;p&gt;These are the steps to setup the current website in a Docker container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget -O- https://github.com/docker/compose/releases/download/1.2.0/docker-compose-&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;uname -s&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;-&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;uname -m&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;gt&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; /usr/local/bin/docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir wordpress
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; wordpress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- raw HTML omitted --&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mysql:5.5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;A VERY STRONG PASSWORD&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;wordpress:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;80:80&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;links&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;db:mysql&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/local/bin/docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;!-- raw HTML omitted --&gt;</description>
    </item>
  </channel>
</rss>
