この記事は、「Docker Advent Calendar 2020」 7日目です。
あいていたので埋めました。
前日は、@c3driveさんのAWSにコンテナ環境を構築する
はじめに
- Nervesは、
- Elixirというプログラミング言語でIoT開発を楽しむことができます
- Nervesは環境設定がいろいろ必要です
- 慣れてしまえばそうでもないのですがはじめてやるにはいろいろ罠があるというか
- それで、@takasehideki 先生がElixirでIoT#4.1.2:[使い方篇] Docker(とVS Code)だけ!でNerves開発環境を整備するを公開してくれました
- 知り合いにすぐ試してもらいたい!
- NervesJPというグループの会合で、このコンテナをAzure Container Instancesで動かせないの? みたいな話がでたので、いいネタだとおもってかきました
- macOS 10.15.7
- Docker 20.10.0
Dockerfile
# docker-elixir 1.11.2
# https://hub.docker.com/_/elixir
FROM elixir:1.11.2
ENV DEBCONF_NOWARNINGS yes
# Install libraries for Nerves development
RUN apt-get update && \
apt-get install -y build-essential automake autoconf git squashfs-tools ssh-askpass pkg-config curl openssh-server && \
rm -rf /var/lib/apt/lists/*
RUN mkdir /var/run/sshd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
COPY ./config_files/id_rsa.pub /root/.ssh/authorized_keys
EXPOSE 22
# [Optional] Uncomment this section to install libraries for customizing Nerves System
#RUN apt-get update && \
# apt-get install -y libssl-dev libncurses5-dev bc m4 unzip cmake python && \
# rm -rf /var/lib/apt/lists/*
# Install fwup (https://github.com/fhunleth/fwup)
ENV FWUP_VERSION="1.8.2"
RUN wget https://github.com/fhunleth/fwup/releases/download/v${FWUP_VERSION}/fwup_${FWUP_VERSION}_amd64.deb && \
apt-get install -y ./fwup_${FWUP_VERSION}_amd64.deb && \
rm ./fwup_${FWUP_VERSION}_amd64.deb && \
rm -rf /var/lib/apt/lists/*
# Install hex and rebar
RUN mix local.hex --force
RUN mix local.rebar --force
# Install Mix environment for Nerves
RUN mix archive.install hex nerves_bootstrap 1.10.0 --force
CMD ["/usr/sbin/sshd", "-D"]
-
https://github.com/NervesJP/docker-nerves/blob/v0.2/Dockerfileをベースに
ssh
接続できるようにしました -
ssh
接続は、@kuboshu83 さんの[Docker入門]コンテナにsshでアクセスするための設定メモ を参考にしました- ありがとうございます!
- https://github.com/NervesJP/docker-nerves/blob/v0.2/Dockerfileを書き換えることなく、もっとスマートにやるやり方があるかもしれません
- 私にはこの
ssh
接続できるようにするという方法しかおもいつきませんでした -
config_files/id_rsa.pub
をおいています-
id_rsa.pub
はすでに~/.ssh/
につくっていたものを使いました - そんなファイルがない場合は
ssh-keygen
でググっていただければ、きっと答えはみつかるでしょう
-
$ mkdir config_files
$ cp ~/.ssh/id_rsa.pub config_files/
$ docker build -t docker-nerves .
- イメージを作ったら、あとの手順は以下のような感じです
-
- Azure Container Registryにイメージを登録
-
- Azure Container Instancesでそのカスタムイメージを使うように設定する
-
-
ssh
で接続してNervesアプリの開発をする
-
-
- 以下、もう少し詳しくみていきます
1. Azure Container Registryにイメージを登録
- クイック スタート:Azure portal を使用して Azure コンテナー レジストリを作成する
- だいたいここに書いてある通りにやっていけばよいです
- 私はイメージのプッシュにAzure CLIなるものは一切つかいませんでした
- Azure Container Registryのコンソールに「クイック スタート」というページがあるのでそこを参考にするとよいです
- まず「アクセスキー」というページに行って、管理者ユーザーを有効にしておきます
- そこに書いてあるユーザー名とpasswordは
docker login
でつかいます
$ docker login xxx.azurecr.io
$ docker tag docker-nerves xxx.azurecr.io/docker-nerves
$ docker push xxx.azurecr.io/docker-nerves
- xxxは、Azure Container Registryを作るときに決めた名前(値)がはいります
2. Azure Container Instancesでそのカスタムイメージを使うように設定する
- クイック スタート:Azure portal を使用してコンテナー インスタンスを Azure 内にデプロイするな感じですすめます
- ネットワークは
パプリック
にして、ポート22
を開けておきます - 設定するのはそれくらいで、あとは
次へ
次へ
です - しばらくするとコンテナが立ち上がるので割り振られたIPアドレスを覚えておきます
- 以下、
20.43.93.225
だとします - このコンテナは記事を書いたあとに消しました
- 以下、
3. ssh
で接続してNervesアプリの開発をする
$ ssh root@20.43.93.225
で、コンテナの中に入ります
コンテナの中での操作
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096
$ cd
$ mix nerves.new hello_nerves
$ cd hello_nerves
$ export MIX_TARGET=rpi4
$ mix deps.get
$ mix firmware
で、無事にコンテナの中にファームウェア
/root/hello_nerves/_build/rpi4_dev/nerves/images/hello_nerves.fw
ができます
Raspberry Pi 4以外の場合は、Targetsから値を選んでください。
開発マシンにもどって
$ scp root@20.43.93.225:/root/hello_nerves/_build/rpi4_dev/nerves/images/hello_nerves.fw .
- クラウドにあるコンテナからファームウェアをもってきて
- microSDカードを開発マシンに挿して
$ fwup hello_nerves.fw
- あっ、fwupのインストール方法を説明していない。。。
- そこは
-
fwupのインストール
- クラウドのコンテナからRaspberry Piに
mix upload
(つまりssh)したいという話がでていた部分はこの記事ではなにもできていません
メモ
-
mix
コマンドを実行したときに、
warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)
という警告がちょいちょいでていました。
Nervesで一体何がつくれるの?
- いろいろ作れます
- 簡単な作例をご紹介します
- 手前味噌です
- Raspberry Pi 4 + Grove Base HAT for Raspberry Pi + Grove Buzzer + Grove ButtonでつくるNervesアラーム
おまけ2 どうやってコンテナの中の.ex
を編集するの?
- Visual Studio Codeでいけちゃいます
- Remote Development using SSHを参考にしてください
- こんな感じで、ローカルファイルを編集している感覚で開発を進めることができます
Wrapping Up
-
@takasehideki 先生の
Dockerfile
は書き換えずにそのままで対応できるもっとスマートな方法があるかもしれません - クラウドのコンテナからRaspberry Piに
mix upload
(つまりssh)したい!? というような話には踏み込めていません - Enjoy Elixir !!!
- この記事をきっかけにNervesに興味をもっていただけましたら、ぜひNervesJPのSlackでお待ちしています!
- 愉快なfolksたちが歓迎します!!!
明日は、@kosuketakeiさんの文系出身業務経験なしのプログラマーがDocker使ってみた です。引き続きお楽しみください。