<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felipe Santos</title>
    <description>The latest articles on DEV Community by Felipe Santos (@felipecrs).</description>
    <link>https://dev.to/felipecrs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F390855%2Fabb98c77-271d-41a7-8f42-4bcfb2ec45e4.jpg</url>
      <title>DEV Community: Felipe Santos</title>
      <link>https://dev.to/felipecrs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipecrs"/>
    <language>en</language>
    <item>
      <title>Running Docker on WSL2 without Docker Desktop (the right way)</title>
      <dc:creator>Felipe Santos</dc:creator>
      <pubDate>Fri, 15 Oct 2021 13:53:41 +0000</pubDate>
      <link>https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8</link>
      <guid>https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8</guid>
      <description>&lt;p&gt;So, now that Docker Desktop is paid under certain scenarios, you may want to switch to something else.&lt;/p&gt;

&lt;p&gt;This is a straight to the point guide on how to make Docker CE run fully on WSL2.&lt;/p&gt;

&lt;p&gt;PS: the title says &lt;em&gt;right way&lt;/em&gt;, but it is just my personal opinion. I am not claiming that any other guide does it in a wrong way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you will get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A full-fledged Docker installation on WSL2&lt;/li&gt;
&lt;li&gt;Docker Daemon automatic start without any crazy hacks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you will not get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker Daemon sharing between Windows and WSL (i.e. you cannot run docker from Windows PowerShell)&lt;/li&gt;
&lt;li&gt;Docker Daemon sharing between WSL distributions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Requisites
&lt;/h2&gt;

&lt;p&gt;I will consider that you already have WSL2 working, and you are using Ubuntu as your distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guide
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install Docker CE on Ubuntu by following the &lt;a href="https://docs.docker.com/engine/install/ubuntu/"&gt;official guide&lt;/a&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Ensures not older packages are installed
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get remove docker docker-engine docker.io containerd runc
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Ensure pre-requisites are installed
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="go"&gt;       ca-certificates \
       curl \
       gnupg \
       lsb-release

&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Adds docker apt key
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/apt/keyrings
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.gpg
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Adds docker apt repository
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;       "deb [arch=$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; signed-by&lt;span class="o"&gt;=&lt;/span&gt;/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;       $&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; stable&lt;span class="s2"&gt;" | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Refreshes apt repos
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Installs Docker CE
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Perform the &lt;a href="https://docs.docker.com/engine/install/linux-postinstall/"&gt;post-installation steps&lt;/a&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Ensures docker group exists
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd docker
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Ensures you are part of it
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Now, close your shell and open another &lt;span class="k"&gt;for &lt;/span&gt;taking the group changes into account
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Make Docker Daemon start on WSL initialization:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First, make sure you are running a recent version of WSL2 (you can update with &lt;code&gt;wsl.exe --update&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Then, you only need to add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;   &lt;span class="nn"&gt;[boot]&lt;/span&gt;
   &lt;span class="py"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To your &lt;code&gt;/etc/wsl.conf&lt;/code&gt; within your WSL distribution.&lt;/p&gt;

&lt;p&gt;Then, restart it with &lt;code&gt;wsl.exe --shutdown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To verify that docker works&lt;/strong&gt;, you can run &lt;code&gt;docker version&lt;/code&gt;. If you do not receive any permission denied error, you are good to go.&lt;/p&gt;

&lt;p&gt;You can also verify that Docker Compose got installed by running &lt;code&gt;docker compose version&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Installing Docker Compose Switch (to use the legacy &lt;code&gt;docker-compose&lt;/code&gt; command instead of &lt;code&gt;docker compose&lt;/code&gt;):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Finds the latest version
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;switch_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{url_effective}"&lt;/span&gt; https://github.com/docker/compose-switch/releases/latest | xargs &lt;span class="nb"&gt;basename&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Downloads the binary
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-fL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/docker-compose &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;       "https://github.com/docker/compose-switch/releases/download/$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;switch_version&lt;span class="o"&gt;}&lt;/span&gt;/docker-compose-linux-&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assigns execution permission to it
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PS: I suggest to install the &lt;code&gt;docker-compose&lt;/code&gt; binary to &lt;code&gt;/usr/local/bin/&lt;/code&gt; because otherwise, the &lt;em&gt;VS Code - Dev Containers&lt;/em&gt; extension will not find it.&lt;/p&gt;

&lt;p&gt;To verify it works, you can run &lt;code&gt;docker-compose version&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the Docker Credential Helper:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You will need this if you want Docker to store your credentials securely when you perform &lt;code&gt;docker login&lt;/code&gt;. Thanks to the WSL interoperability between Windows, you can install the Windows version of the Docker Credential Helper inside of WSL itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Finds the latest version
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;wincred_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{url_effective}"&lt;/span&gt; https://github.com/docker/docker-credential-helpers/releases/latest | xargs &lt;span class="nb"&gt;basename&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Downloads and extracts the .exe
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-fL&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/docker-credential-wincred.exe &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;       "https://github.com/docker/docker-credential-helpers/releases/download/$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;wincred_version&lt;span class="o"&gt;}&lt;/span&gt;/docker-credential-wincred-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;wincred_version&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.windows-&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;.exe&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Assigns execution permission to it
&lt;span class="gp"&gt;   $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/docker-credential-wincred.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, configure your Docker CLI to use it by assuring that the following is present in your &lt;code&gt;~/.docker/config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"credsStore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wincred.exe"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify that it works, you can try to &lt;code&gt;docker login&lt;/code&gt; and if not, Docker will complain about storing credentials in plain text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final considerations
&lt;/h2&gt;

&lt;p&gt;The entire setup process may take some time, but you will have achieved almost everything that Docker Desktop used to provide to you (by the way, I use &lt;a href="https://k3d.io/"&gt;&lt;code&gt;k3d&lt;/code&gt;&lt;/a&gt; as an alternative to Docker Desktop's built-in K8s provisioner).&lt;/p&gt;

&lt;p&gt;However, you can achieve a similar (and even higher/better) level of easiness that Docker Desktop provided to you by wrapping all the steps above in your dotfiles installation steps.&lt;/p&gt;

&lt;p&gt;For example, in my &lt;a href="https://github.com/felipecrs/dotfiles"&gt;dotfiles&lt;/a&gt;, all these steps are automated, including &lt;a href="https://github.com/felipecrs/dotfiles/blob/5a47ece0e9457e23ff51e605c2caded1c61da402/home/dot_docker/modify_config.json.tmpl"&gt;configuring &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/felipecrs/dotfiles/blob/8974f2c741b6cb08295ecaaacb2b6c7c407312df/home/dot_profile.tmpl#L3-L8"&gt;changing &lt;code&gt;~/.profile&lt;/code&gt;&lt;/a&gt;, and even providing a way to automatically update your extra binaries (&lt;a href="https://github.com/felipecrs/dotfiles/blob/f5cff904bc4669f8e77875c06fd72869e6635b04/root/.chezmoiexternal.yaml#L54-L57"&gt;&lt;code&gt;docker-compose&lt;/code&gt;&lt;/a&gt;, or the &lt;a href="https://github.com/felipecrs/dotfiles/blob/f5cff904bc4669f8e77875c06fd72869e6635b04/root/.chezmoiexternal.yaml#L60-L63"&gt;&lt;code&gt;wincred.exe&lt;/code&gt;&lt;/a&gt;) every time you update your dotfiles (by using &lt;a href="https://www.chezmoi.io/docs/reference/#chezmoiexternalformat"&gt;a feature&lt;/a&gt; of &lt;a href="https://www.chezmoi.io/"&gt;chezmoi&lt;/a&gt; - a dotfiles manager which I totally recommend).&lt;/p&gt;

</description>
      <category>docker</category>
      <category>linux</category>
      <category>windows</category>
      <category>wsl</category>
    </item>
    <item>
      <title>Dev Ubuntu 20.04: the history of a Virtual Machine managed as a Docker image</title>
      <dc:creator>Felipe Santos</dc:creator>
      <pubDate>Tue, 26 May 2020 05:41:55 +0000</pubDate>
      <link>https://dev.to/felipecrs/dev-ubuntu-20-04-the-history-of-a-virtual-machine-managed-as-a-docker-image-5ahh</link>
      <guid>https://dev.to/felipecrs/dev-ubuntu-20-04-the-history-of-a-virtual-machine-managed-as-a-docker-image-5ahh</guid>
      <description>&lt;p&gt;First, what is it? This is a pre-configured Ubuntu 20.04 virtual machine that you can use for general development. With just a few steps you can have it up and running, ready to code, and adjusted to your needs.&lt;/p&gt;

&lt;p&gt;But why? Why not install my own Ubuntu ISO in Virtual Box and do what it takes inside of it? And that's a good question. The answer is that you don't have a fully reproducible, disposable, shareable, and managed environment that way. And I know, that sounds a lot like how &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; images work in the containers world.&lt;/p&gt;

&lt;p&gt;That was the main motivation: Docker with their &lt;code&gt;Dockerfile&lt;/code&gt;s and how the images can be stored in a registry, ready to be used. Luckily, for the virtual machine world we have &lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt;, which aimed to solve the problem I was trying to solve: you can define a &lt;code&gt;Vagrantfile&lt;/code&gt; and set some commands to run when you power up the machine. And then, you have the Vagrant Cloud, a place to store these machines.&lt;/p&gt;

&lt;p&gt;So far so good, but then things started to become more interesting. Most of the base boxes (pre-built virtual machines you can use as a base in the &lt;code&gt;Vagrantfile&lt;/code&gt;) didn't have a desktop installed. And looking at the official guides from Vagrant, they suggest we use &lt;a href="https://www.packer.io/"&gt;Packer&lt;/a&gt;, which can take a Linux ISO and start making modifications on top of. But it sounded too bare metal for my purpose, I just wanted to take an Ubuntu and apply some changes on it, the same way we do in Docker.&lt;/p&gt;

&lt;p&gt;For solving that problem I first used &lt;a href="https://app.vagrantup.com/bento/boxes/ubuntu-18.04"&gt;&lt;code&gt;bento/ubuntu-18.04&lt;/code&gt;&lt;/a&gt; as the base box. It's kind of an official Ubuntu base box in the Vagrant Cloud, considering that the Canonical's one &lt;a href="https://github.com/hashicorp/vagrant/issues/9425#issuecomment-426114046"&gt;had some blocking issues&lt;/a&gt;. But later, when I switched to Ubuntu 20.04, I chose &lt;a href="https://app.vagrantup.com/peru/boxes/ubuntu-20.04-desktop-amd64"&gt;&lt;code&gt;peru/ubuntu-20.04-desktop-amd64&lt;/code&gt;&lt;/a&gt;. It appeared to be a solid base box with desktop already installed. I even contributed to &lt;a href="https://github.com/ruzickap/packer-templates/issues/92"&gt;opening an Issue&lt;/a&gt; in its &lt;a href="https://github.com/ruzickap/packer-templates"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then, I wanted to make it automatic. I wanted to do only the code part, such as adding a new tool in the virtual machine, and levering computers to build and release it for me. But there were two obstacles: I would need a CI that supports virtualization to run Vagrant and Virtual Box to build the machine. And I would also need a CI that supported a fake display, to run a simple test of the box after it's being built. Fortunately, &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; has these two. I would be happy to use the awesome GitHub Actions and even contribute with some actions for the same purpose, but sadly, &lt;a href="https://github.com/actions/virtual-environments/issues/183"&gt;it doesn't support nested virtualization&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The next step was to manage the release cycle. For my luck, I met &lt;a href="https://github.com/semantic-release/semantic-release"&gt;&lt;code&gt;semantic-release&lt;/code&gt;&lt;/a&gt;, a popular module to automate the releases in Node.js projects, relying on commit messages that follow a convention, and in my case, the &lt;a href="https://www.conventionalcommits.org/"&gt;Conventional Commits&lt;/a&gt;. I immediately fell in love with it and was excited to integrate into my project. I first had to &lt;a href="https://github.com/felipecassiors/dev-ubuntu-20.04/pull/5"&gt;find a way on how to enforce Conventional Commits&lt;/a&gt; on my repository, and then, make &lt;code&gt;semantic-release&lt;/code&gt; be able to push it to Vagrant Cloud.&lt;/p&gt;

&lt;p&gt;I managed to convert my repository into an NPM based one, mainly due to its &lt;code&gt;package.json&lt;/code&gt; since I would be using many NPM modules. But I was so happy with the result, that this even started a side project: a &lt;a href="https://github.com/felipecassiors/semantic-release-vagrant"&gt;Vagrant plugin for &lt;code&gt;semantic-release&lt;/code&gt;&lt;/a&gt;, but still in an early development stage.&lt;/p&gt;

&lt;p&gt;So now, if I want to add a new tool or new customization in the virtual machine, I just have to add the commands I want to a Bash script and commit to GitHub. After merging on the &lt;code&gt;master&lt;/code&gt; branch, Travis automatically builds the virtual machine and then &lt;code&gt;semantic-release&lt;/code&gt; deal with the bureaucracy of the versioning and releases for me.&lt;/p&gt;

&lt;p&gt;It was also much-pleasant to receive the &lt;a href="https://github.com/felipecassiors/dev-ubuntu-20.04/issues/4"&gt;first Issue the project&lt;/a&gt; from the community, which led me to create a brand new badge to display the sizes of any boxes in Vagrant Cloud. &lt;a href="https://github.com/felipecassiors/vagrant-box-size/"&gt;And you can use it right now!&lt;/a&gt; See this preview: &lt;br&gt;
&lt;a href="https://app.vagrantup.com/bento/boxes/ubuntu-18.04"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_MdggYF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://img.shields.io/endpoint%3Furl%3Dhttps://runkit.io/felipecassiors/vagrant-box-size/branches/master/bento/ubuntu-18.04/vmware_desktop" alt="Vagrant box size" width="123" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I suggest you give it a try. Take a look at the &lt;a href="https://github.com/felipecassiors/dev-ubuntu-20.04#get-started"&gt;Get started&lt;/a&gt; guide, it's simple. There are some tips for personal customizations, &lt;a href="https://github.com/felipecassiors/my-dev-ubuntu-20.04"&gt;such as my own&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And there are still plans for the future: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continue the development of the Vagrant plugin for &lt;code&gt;semantic-release&lt;/code&gt;, to help other people automate their releases without having to rely on complex Bash scripts.&lt;/li&gt;
&lt;li&gt;Create a &lt;a href="https://help.github.com/github/creating-cloning-and-archiving-repositories/creating-a-template-repository"&gt;repository template&lt;/a&gt; to help other people scaffold their own fully managed virtual machine, which I think can be beneficial for development teams, that want to enforce the same environment efficiently.&lt;/li&gt;
&lt;li&gt;Somehow integrate with &lt;code&gt;dotfiles&lt;/code&gt; repositories, and many other tricky adjustments to be made programmatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/felipecrs"&gt;
        felipecrs
      &lt;/a&gt; / &lt;a href="https://github.com/felipecrs/dev-ubuntu"&gt;
        dev-ubuntu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Vagrant box with desktop, tools, and adjustments for developers
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Deprecation notice&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;I have not been using this box anymore because I prefer to use WSL2 on Windows rather than VirtualBox, so it does not make sense to me to keep maintaining it.&lt;/p&gt;
&lt;p&gt;Furthermore, I have putted much more effort on &lt;a href="https://github.com/felipecrs/dotfiles"&gt;my dotfiles&lt;/a&gt;, which contains the latest and greatest enhancements, and then I use it to bootstrap any VM with a single command. That means that for me, &lt;a href="https://github.com/felipecrs/dotfiles"&gt;my dotfiles project&lt;/a&gt; is replacing dev-ubuntu.&lt;/p&gt;
&lt;p&gt;If this project worked well for you and you would like to keep using it (instead of moving to some dotfiles-like approach), I would suggest you to fork this repository and setup your own.&lt;/p&gt;
&lt;p&gt;Ephemeral development environments such as Gitpod and GitHub Codespaces has never been so popular, and that is another reason why not to use a heavy VM.&lt;/p&gt;
&lt;p&gt;The latest version of this box will still be available in Vagrant Cloud to download…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/felipecrs/dev-ubuntu"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Download link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://app.vagrantup.com/felipecassiors/boxes/dev-ubuntu-20.04"&gt;Available on Vagrant Cloud&lt;/a&gt;&lt;/p&gt;

</description>
      <category>octograd2020</category>
    </item>
  </channel>
</rss>
