chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

Dockerで組み込みRust 開発環境を作る(半分夢)

背景:いろいろ諸業務があって組み込みRustの勉強が止まっていた。時間ができたので、勉強を再開したい。特に、室内環境測定で、気圧が測れていないので、センサを追加したい。
課題:組み込みRustのビルド環境がたまたまエラーなくかろうじて動いている感じ、かなりあやうい
アプローチ:仕事でじゃっかんk8sも関係している*1。Docker等のコンテナ技術を理解するため、Dockerで組み込みRust環境を作る*2。ビルドするたびに、コンテナが起動されるイメージ(yamlで記述できない実行環境は安定動作しているとは言えないスタンスで・・)

詳細:
コンテナ化のポイント(?)・・Dockerとは実行環境のパッケージ化(隔離化)と理解していて、実行環境は揮発性で、消えるのを前提とする。よってデータ永続化ではないと。だから、、rust build用のファイル一式は /home/<user_id>/.rust? 配下に置かれるはずで、この領域をコンテナ内に閉じ込めると・・・ ソース類や生成物は、マウントした外部DISK?領域に配置すると・・

build環境構築手順を復習
まずrustupを入れる
Other Installation Methods - Rust Forge

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s --

nightlyを入れる、toolchainを入れる、dependenciesを入れる
Software - Embedded Rust on Espressif

rustup toolchain install nightly-2023-02-28 --component rust-src
cargo install cargo-espflash espflash ldproxy
sudo apt install llvm-dev libclang-dev clang

flash書き込みはコンテナの外で実行してもいいだろう。。

Dockerコンテナを作る際にどのイメージを用いるか? 単純にaplineでいいのかそれとも、debianにしておくのが無難か・・ 過去はalpineを使ったので、今回は、Slim版のdebianを選んでみる。

3-slim-bullseye, slim-bullseye

file: Dockerfile

FROM debian:bullseye-slim

ベースだけをビルドしてみる

rustbld00@MBP01:~/lang/docker/rust_build_env$ sudo docker build -t rust_buld:0.01 .

rustbld00@MBP01:~/lang/docker/rust_build_env$ sudo docker images
REPOSITORY     TAG       IMAGE ID       CREATED       SIZE
rust_buld      0.01      066e757fd172   2 weeks ago   80.5MB
kindest/node   <none>    3da3ccb2a738   7 weeks ago   926MB
hello-world    latest    9c7a54a9a43c   8 weeks ago   13.3kB

imageをrunコマンドでコンテナ生成まで一気にやってみる。/etc/os-releaseを確認。debianのイメージだと確認

rustbld00@MBP01:~/lang/docker/rust_build_env$ sudo docker run -it 066e757fd172  cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

気楽にrunしまくったので、コンテナが大量にできてしまっている(後から消しておこう)

rustbld00@MBP01:~/lang/docker/rust_build_env$ sudo docker ps -a | grep 066e757fd172
aae02f6f7b1d   066e757fd172           "cat /etc/os-release"    4 minutes ago   Exited (0) 4 minutes ago                               pedantic_montalcini
26085934a1d6   066e757fd172           "/bin/uname -a"          4 minutes ago   Exited (0) 4 minutes ago                               crazy_ptolemy
8f28f9fde07e   066e757fd172           "/bin/uname"             5 minutes ago   Exited (0) 4 minutes ago                               objective_benz
5e435c70ace4   066e757fd172           "/bin/hostname"          5 minutes ago   Exited (0) 5 minutes ago                               unruffled_thompson
0111fc4309cc   066e757fd172           "/bin/pwd"               5 minutes ago   Exited (0) 5 minutes ago                               busy_davinci
91fb1700a504   066e757fd172           "/bin/ls"                5 minutes ago   Exited (0) 5 minutes ago                               zealous_cohen

image/container/run/create/start etcが時々ワケ分からなくなるのでライフサイクルを整理

コンテナを生成してみる

root@MBP01:/home/rustbld00/lang/docker/rust_build_env# docker create --name rust_build_container 066e757fd172
61124abb2985885ddd8f1e216f8380ac817517a0d8a21be0527b626b1ebdfc7a
root@MBP01:/home/rustbld00/lang/docker/rust_build_env# docker ps -a | grep build
61124abb2985   066e757fd172           "bash"                   30 seconds ago   Created                                                 rust_build_container

コンテナ内は以下となっていた。IDはroot、ユーザ用ディレクトリして/homeが存在、ownerはroot、DISKはホストのDISKを使う気が満々、インストール済みパッケージは最小限

root@f060e1c114de:/# id
uid=0(root) gid=0(root) groups=0(root)
root@f060e1c114de:/# ls
bin/  boot/  dev/  etc/  home/  lib/  lib64/  media/  mnt/  opt/  proc/  root/  run/  sbin/  srv/  sys/  tmp/  usr/  var/

root@f060e1c114de:/home# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         468G  153G  292G  35% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/nvme0n1p2  468G  153G  292G  35% /etc/hosts
tmpfs           1.9G     0  1.9G   0% /proc/asound
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /proc/scsi
tmpfs           1.9G     0  1.9G   0% /sys/firmware

root@f060e1c114de:/home# dpkg --list
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                    Version                      Architecture Description
+++-=======================-============================-============-========================================================================
ii  adduser                 3.118                        all          add and remove users and groups
ii  apt                     2.2.4                        amd64        commandline package manager
ii  base-files              11.1+deb11u7                 amd64        Debian base system miscellaneous files
ii  base-passwd             3.5.51                       amd64        Debian base system master password and group files
ii  bash                    5.1-2+deb11u1                amd64        GNU Bourne Again SHell
ii  bsdutils                1:2.36.1-8+deb11u1           amd64        basic utilities from 4.4BSD-Lite
ii  coreutils               8.32-4+b1                    amd64        GNU core utilities
ii  dash                    0.5.11+git20200708+dd9ef66-5 amd64        POSIX-compliant shell
ii  debconf                 1.5.77                       all          Debian configuration management system
ii  debian-archive-keyring  2021.1.1+deb11u1             all          GnuPG archive keys of the Debian archive
ii  debianutils             4.11.2                       amd64        Miscellaneous utilities specific to Debian
ii  diffutils               1:3.7-5                      amd64        File comparison utilities
ii  dpkg                    1.20.12                      amd64        Debian package management system
ii  e2fsprogs               1.46.2-2                     amd64        ext2/ext3/ext4 file system utilities
ii  findutils               4.8.0-1                      amd64        utilities for finding files--find, xargs
ii  gcc-10-base:amd64       10.2.1-6                     amd64        GCC, the GNU Compiler Collection (base package)
ii  gcc-9-base:amd64        9.3.0-22                     amd64        GCC, the GNU Compiler Collection (base package)
ii  gpgv                    2.2.27-2+deb11u2             amd64        GNU privacy guard - signature verification tool
ii  grep                    3.6-1+deb11u1                amd64        GNU grep, egrep and fgrep
ii  gzip                    1.10-4+deb11u1               amd64        GNU compression utilities
ii  hostname                3.23                         amd64        utility to set/show the host name or domain name
ii  init-system-helpers     1.60                         all          helper tools for all init systems
ii  libacl1:amd64           2.2.53-10                    amd64        access control list - shared library
ii  libapt-pkg6.0:amd64     2.2.4                        amd64        package management runtime library
ii  libattr1:amd64          1:2.4.48-6                   amd64        extended attribute handling - shared library
ii  libaudit-common         1:3.0-2                      all          Dynamic library for security auditing - common files
ii  libaudit1:amd64         1:3.0-2                      amd64        Dynamic library for security auditing
ii  libblkid1:amd64         2.36.1-8+deb11u1             amd64        block device ID library
ii  libbz2-1.0:amd64        1.0.8-4                      amd64        high-quality block-sorting file compressor library - runtime
ii  libc-bin                2.31-13+deb11u6              amd64        GNU C Library: Binaries
ii  libc6:amd64             2.31-13+deb11u6              amd64        GNU C Library: Shared libraries
ii  libcap-ng0:amd64        0.7.9-2.2+b1                 amd64        An alternate POSIX capabilities library
ii  libcom-err2:amd64       1.46.2-2                     amd64        common error description library
ii  libcrypt1:amd64         1:4.4.18-4                   amd64        libcrypt shared library
ii  libdb5.3:amd64          5.3.28+dfsg1-0.8             amd64        Berkeley v5.3 Database Libraries [runtime]
ii  libdebconfclient0:amd64 0.260                        amd64        Debian Configuration Management System (C-implementation library)
ii  libext2fs2:amd64        1.46.2-2                     amd64        ext2/ext3/ext4 file system libraries
ii  libffi7:amd64           3.3-6                        amd64        Foreign Function Interface library runtime
ii  libgcc-s1:amd64         10.2.1-6                     amd64        GCC support library
ii  libgcrypt20:amd64       1.8.7-6                      amd64        LGPL Crypto library - runtime library
ii  libgmp10:amd64          2:6.2.1+dfsg-1+deb11u1       amd64        Multiprecision arithmetic library
ii  libgnutls30:amd64       3.7.1-5+deb11u3              amd64        GNU TLS library - main runtime library
ii  libgpg-error0:amd64     1.38-2                       amd64        GnuPG development runtime library
ii  libgssapi-krb5-2:amd64  1.18.3-6+deb11u3             amd64        MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
ii  libhogweed6:amd64       3.7.3-1                      amd64        low level cryptographic library (public-key cryptos)
ii  libidn2-0:amd64         2.3.0-5                      amd64        Internationalized domain names (IDNA2008/TR46) library
ii  libk5crypto3:amd64      1.18.3-6+deb11u3             amd64        MIT Kerberos runtime libraries - Crypto Library
ii  libkeyutils1:amd64      1.6.1-2                      amd64        Linux Key Management Utilities (library)
ii  libkrb5-3:amd64         1.18.3-6+deb11u3             amd64        MIT Kerberos runtime libraries
ii  libkrb5support0:amd64   1.18.3-6+deb11u3             amd64        MIT Kerberos runtime libraries - Support library
ii  liblz4-1:amd64          1.9.3-2                      amd64        Fast LZ compression algorithm library - runtime
ii  liblzma5:amd64          5.2.5-2.1~deb11u1            amd64        XZ-format compression library
ii  libmount1:amd64         2.36.1-8+deb11u1             amd64        device mounting library
ii  libnettle8:amd64        3.7.3-1                      amd64        low level cryptographic library (symmetric and one-way cryptos)
ii  libnsl2:amd64           1.3.0-2                      amd64        Public client interface for NIS(YP) and NIS+
ii  libp11-kit0:amd64       0.23.22-1                    amd64        library for loading and coordinating access to PKCS#11 modules - runtime
ii  libpam-modules:amd64    1.4.0-9+deb11u1              amd64        Pluggable Authentication Modules for PAM
ii  libpam-modules-bin      1.4.0-9+deb11u1              amd64        Pluggable Authentication Modules for PAM - helper binaries
ii  libpam-runtime          1.4.0-9+deb11u1              all          Runtime support for the PAM library
ii  libpam0g:amd64          1.4.0-9+deb11u1              amd64        Pluggable Authentication Modules library
ii  libpcre2-8-0:amd64      10.36-2+deb11u1              amd64        New Perl Compatible Regular Expression Library- 8 bit runtime files
ii  libpcre3:amd64          2:8.39-13                    amd64        Old Perl 5 Compatible Regular Expression Library - runtime files
ii  libseccomp2:amd64       2.5.1-1+deb11u1              amd64        high level interface to Linux seccomp filter
ii  libselinux1:amd64       3.1-3                        amd64        SELinux runtime shared libraries
ii  libsemanage-common      3.1-1                        all          Common files for SELinux policy management libraries
ii  libsemanage1:amd64      3.1-1+b2                     amd64        SELinux policy management library
ii  libsepol1:amd64         3.1-1                        amd64        SELinux library for manipulating binary security policies
ii  libsmartcols1:amd64     2.36.1-8+deb11u1             amd64        smart column output alignment library
ii  libss2:amd64            1.46.2-2                     amd64        command-line interface parsing library
ii  libssl1.1:amd64         1.1.1n-0+deb11u5             amd64        Secure Sockets Layer toolkit - shared libraries
ii  libstdc++6:amd64        10.2.1-6                     amd64        GNU Standard C++ Library v3
ii  libsystemd0:amd64       247.3-7+deb11u2              amd64        systemd utility library
ii  libtasn1-6:amd64        4.16.0-2+deb11u1             amd64        Manage ASN.1 structures (runtime)
ii  libtinfo6:amd64         6.2+20201114-2+deb11u1       amd64        shared low-level terminfo library for terminal handling
ii  libtirpc-common         1.3.1-1+deb11u1              all          transport-independent RPC library - common files
ii  libtirpc3:amd64         1.3.1-1+deb11u1              amd64        transport-independent RPC library
ii  libudev1:amd64          247.3-7+deb11u2              amd64        libudev shared library
ii  libunistring2:amd64     0.9.10-4                     amd64        Unicode string library for C
ii  libuuid1:amd64          2.36.1-8+deb11u1             amd64        Universally Unique ID library
ii  libxxhash0:amd64        0.8.0-2                      amd64        shared library for xxhash
ii  libzstd1:amd64          1.4.8+dfsg-2.1               amd64        fast lossless compression algorithm
ii  login                   1:4.8.1-1                    amd64        system login tools
ii  logsave                 1.46.2-2                     amd64        save the output of a command in a log file
ii  lsb-base                11.1.0                       all          Linux Standard Base init script functionality
ii  mawk                    1.3.4.20200120-2             amd64        Pattern scanning and text processing language
ii  mount                   2.36.1-8+deb11u1             amd64        tools for mounting and manipulating filesystems
ii  ncurses-base            6.2+20201114-2+deb11u1       all          basic terminal type definitions
ii  ncurses-bin             6.2+20201114-2+deb11u1       amd64        terminal-related programs and man pages
ii  passwd                  1:4.8.1-1                    amd64        change and administer password and group data
ii  perl-base               5.32.1-4+deb11u2             amd64        minimal Perl system
ii  sed                     4.7-1                        amd64        GNU stream editor for filtering/transforming text
ii  sysvinit-utils          2.96-7+deb11u1               amd64        System-V-like utilities
ii  tar                     1.34+dfsg-1                  amd64        GNU version of the tar archiving utility
ii  tzdata                  2021a-1+deb11u10             all          time zone and daylight-saving time data
ii  util-linux              2.36.1-8+deb11u1             amd64        miscellaneous system utilities
ii  zlib1g:amd64            1:1.2.11.dfsg-2+deb11u2      amd64        compression library - runtime

rustupまで入るDockerfileを試作

FROM debian:bullseye-slim
RUN apt-get update \
  && apt-get install --yes curl \
  && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > /tmp/rustup-init.sh \
  && chmod +x /tmp/rustup-init.sh \
  && /tmp/rustup-init.sh -y \
  && . "$HOME/.cargo/env" \
  && rm /tmp/rustup-init.sh

rustpu-init.shではインストール開始前の最終確認があり、キー入力が必要である。普通のshだったらキーボードから操作できるので苦労はないが、Dockerfileは全自動で動かす必要があり、キー入力待ちを回避するため、インストールスクリプト(rustup-init.sh)をコマンドとして実行して、-y オプションを指定する。(もっとシンプルなやり方があるのかもですが、、思い浮かばない)

rustupまでは入ることを確認

#  docker build -t rust_build_rustup:0.2 .

root@MBP01:/home/rustbld00/lang/docker/rust_build_env# docker run -it rust_build_rustup:0.2 /bin/bash
root@83614842f17a:/# rustup
rustup 1.26.0 (5af9b9484 2023-04-05)
The Rust toolchain installer

USAGE:
    rustup [OPTIONS] [+toolchain] <SUBCOMMAND>

nightlyのToolChainを入れるところまではできた。さらに続いていろいろ入れる必要あり。
しかし、、buildだけならまだしも、プロジェクトを作るのにcargoコマンドを使うが、cargoを実行する都度コンテナを起動するということか?? ホスト環境のcargoコマンドを打つ感覚で、コンテナをstartさせ、コンテナ内でcargoコマンドを実行、実行が終わるとコンテナもstopさせるという感じか・・

FROM debian:bullseye-slim
RUN apt-get update \
  && apt-get install --yes curl \
  && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > /tmp/rustup-init.sh \
  && chmod +x /tmp/rustup-init.sh \
  && /tmp/rustup-init.sh -y \
  && . "$HOME/.cargo/env" \
  && rm /tmp/rustup-init.sh
RUN . "$HOME/.cargo/env" \
  && rustup toolchain install nightly-2023-02-28 --component rust-src

■参考URL
過去に環境構築した時の記録
Rustビルド環境構築 - chakokuのブログ(rev4)

*1:ややこしすぎて全容つかめず

*2:DockerかDocker Composeか、いずれか