背景:いろいろ諸業務があって組み込み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)