How do you feel that you can acquire the development environment for Nerves without affecting the host environment? The Docker can do it with minimal steps!!
We want to offer the Docker solution mainly for beginners and Windows users.
Dockerfile:
Docker Hub (pre-built image)
https://hub.docker.com/r/nervesjp/nerves
VS Code dev-container:
Main contributions and use cases
- If you are new to Nerves, you can easily try out its development without any affect on your host PC.
- It will be convenient for hands-on training to provide a unified environment for all participants.
- Even if you are already using Nerves, you can quickly try out the latest development environment. Docker does not affect your host environment.
- The Docker Hub repository here publishes the pre-built image. You can try it right away by just pulling it (but it may not always be up to date).
- You can also experience a better development environment by using the Visual Studio Code and its extension.
How to use with Docker alone
You need to install Docker Desktop
Docker has some requirements for host PC to be operated. See details: Windows / macOS
from Docker Hub repository
You can try the Nerves development with pre-built image.
$ docker pull nervesjp/nerves
$ docker run -it -w /workspace nervesjp/nerves
root@6e304327bd2e:/workspace#
from GitHub repository
You can build Docker image locally, and customize it to your needs.
$ git clone https://github.com/NervesJP/docker-nerves
$ cd docker-nerves
$ docker build -t docker-nerves .
$ docker run -it -w /workspace docker-nerves
root@9bc88d0fc7b8:/workspace# pwd
/workspace
root@9bc88d0fc7b8:/workspace# echo ${HOME}
/root
root@9bc88d0fc7b8:/workspace# ls ~/.mix/*
/root/.mix/rebar /root/.mix/rebar3
/root/.mix/archives:
hex-0.20.6 nerves_bootstrap-1.10.0
Tips: Mount volumes on host
Since a filesystem into Docker image will disappear when an image rebuild/execute, it is useful to mount a volume on host to keep files of Nerves project. -v ${PWD}:/workspace
can mount current directory on host to Docker image.
$ docker run -it -w /workspace -v ${PWD}:/workspace docker-nerves
It is also efficient to mount Nerves related setting files, such as ~/.ssh/
and ~/.nerves
. Following is an example to share setting files between host and image.
$ docker run -it -w /workspace -v ${PWD}:/workspace -v ~/.ssh:/root/.ssh -v ~/.nerves:/root/.nerves docker-nerves
More convenient with VS Code
Visual Studio Code is one of the most popular editor for engineers.
Remote - Containers extensions provides an awesome experience with Docker development containers.
See details:
How to use
- Clone the repository
git clone https://github.com/NervesJP/nerves-devcontainer
-
Start VS Code, run the Remote-Containers: Open Folder in Container… command from the Command Palette (F1) or quick actions Status bar item, and select the project folder you cloned at Step 1.
-
After a while, you can enjoy Nerves/Elixir development with Bash on Docker image and VS Code like as follows.
root@ebc5e1a19ae3:/workspaces/nerves-devcontainer# ls
LICENSE.txt README.md
root@ebc5e1a19ae3:/workspaces/nerves-devcontainer# ls ~/.mix/*
/root/.mix/rebar /root/.mix/rebar3
/root/.mix/archives:
hex-0.20.6 nerves_bootstrap-1.10.0
root@ebc5e1a19ae3:/workspaces/nerves-devcontainer# elixir --version
Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Elixir 1.11.2 (compiled with Erlang/OTP 23)
root@ebc5e1a19ae3:/workspaces/nerves-devcontainer# iex
Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Interactive Elixir (1.11.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
- Note that you need to generate your SSH keys, only for the first time to login Docker image.
root@ebc5e1a19ae3:/workspaces/nerves-devcontainer# ssh-keygen -t rsa -N "" -f .ssh/id_rsa`
Tips
Manual build of Docker image locally
This repository will clone pre-built image on Docker Hub.
You can also build Docker image locally by locating above Dockerfile to ./devcontainer
and uncommenting //"dockerFile": "Dockerfile",
on ./devcontainer/devcontainer.json
.
It means you can customize your own Nerves development environment as you want.
Mounted files about Nerves settings
Each time an image is execute, a filesystem into Docker image will disappear. So Nerves related setting directories are mounted in the current (this) directory on the host.
First directory is ${PWD}/.ssh
that is expected to contain id_rsa
and id_rsa.pub
SSH key pairs.
They are used for the construction of Nerves firmware and secure connection to Nerves devices.
It is mounted to ~/.ssh/
on Docker image.
To generate your SSH keys, you need to operate ssh-keygen -t rsa -N "" -f /workspaces/nerves-devcontainer/.ssh/id_rsa
after logging into Docker image for the first time.
Second is ${PWD}./nerves
that is mounted to ~/.nerves
. It keeps archives of Nerves toolchains and nerves_system_br.
If it disappeared when Docker container was restarted, you need to download archives every time you operate mix deps.get
.
So we decided to mount it on this directory.
Although mix deps.get
at first will take a while to unzip archives to ./nerves/artifacts
due to poor performance about bindings between host and container filesystems, we think it is acceptable compared that we always have to wait when running mix deps.get
for a long time.
In addition, your Nerves project can be kept on the current directory by the VS Code automatic feature.
Current limitation(s)
burn Nerves firmware to microSD card
Docker has restrict policies to avoid effecting host environment. Therefore, mix burn
cannot be operated from Docker image because there is no right to access /dev
to on host as a root user.
One way to burn Nerves firmware is just operating fwup
on the host. fwup
is an utility for constructing/burning Nerves firmware.
After installing fwup
on the host according to this step, please do following command on the host terminal (e.g., PowerShell as Administrator, Terminal.app).
$ cd <your_nerves_project_dir>
$ fwup _build/${MIX_TARGET}_dev/nerves/images/<project_name>.fw
Please let us know if you have a cool solution! (issue)
Any questions, suggestions and comments (including English quality ) are welcome!!