Docker学习笔记 〜 直到使用TinyGo

我将创建一份学习笔记,目标是使用Docker构建ESP32和RP2040等开发环境,或者在Ubuntu等平台上创建小型工具。我正在一台旧的Mac上进行尝试。

在这篇文章中,按照标题所示,我们讨论了如何使用TinyGo。

参考

 

$ docker --version
Docker version 20.10.21, build baeda1f
$ docker compose version
Docker Compose version v2.13.0

とにかく ubuntu を起動する

$ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
37aaf24cf781: Pull complete 
Digest: sha256:9b8dec3bf938bc80fbe758d856e96fdfab5f56c39d44b0cff351e847bb1b01ea
Status: Downloaded newer image for ubuntu:latest
root@a01ea690ce9f:/# lsb_release -a
bash: lsb_release: command not found
root@a01ea690ce9f:/# cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@a01ea690ce9f:/# 
exit
$

イメージ ubuntu がダウンロードされ,コンテナ を起動し,ついでに bash を実行して終了しています。-it は標準入力と結びつけます。

このままでもかなり使えますが,とりあえずここではコンテナを消します。IDが表示されているのでそれを指定します。

$ docker rm -f a01ea690ce9f
a01ea690ce9f
$

在主机和容器间共享工作目录通过绑定挂载。

在容器中创建文件并在主机上进行确认。

$ docker run -it --mount type=bind,src="$(pwd)",target=/work --name my_container ubuntu bash # 新しいコンテナを作成・起動
root@92c6098b81bf:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr  work
root@92c6098b81bf:/# cd work
root@92c6098b81bf:/work# echo "Hello from docker" > message.txt
root@92c6098b81bf:/work# exit
exit
$ ls
message.txt
$ cat message.txt 
Hello from docker
$

ホストのカレントディレクトリを,コンテナ内 /work にマウントしてアクセスしています。
次はホスト側でファイルを更新しコンテナ内で確認します。

$ echo "reply from host" >> message.txt # ホスト作業
$ docker start -i my_container
root@92c6098b81bf:/# cd work
root@92c6098b81bf:/work# ls
message.txt
root@92c6098b81bf:/work# cat message.txt 
Hello from docker
reply from host
root@92c6098b81bf:/work# 

使用命令 “docker start -i my_container” 来重新启动容器。

如果我们达到这一点,最初想要做的”在容器内进行编译等操作,并将结果保留在主机上”的事情似乎是可以实现的!

执行容器内的命令

在通过Ubuntu创建的容器内安装Python 3的同时,考虑从主机上执行该Python 3。

在容器中安装Python3。

$ docker run -it --mount type=bind,src="$(pwd)",target=/work -w /work --name my_container ubuntu bash
root@e568cbc0287e:/# apt update && apt -y upgrade && apt install -y python3
Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]          

# 途中省略

running python post-rtupdate hooks for python3.10...
Processing triggers for libc-bin (2.35-0ubuntu3.4) ...
root@9d62a0299236:/work# python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>    # [Ctrl] + [D] で抜ける
root@9d62a0299236:/work# 
exit
$

在创建容器时,通过使用-w选项,将工作目录指定为容器内的 /work。

我试着从主机中调用

$ docker restart my_container
my_container
$ docker exec -it my_container python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>   # [Ctrl]+[D] で抜ける
$ echo "print('hello')" >hello.py
$ docker exec -it my_container python3 hello.py
hello
$

由于在容器内执行 python3,因此在 /work/ 目录下,它将加载并执行可见的宿主机的 hello.py。

使用–rm选项无需保留容器即可启动

只要进行编译并留下结果,应该就不需要保存容器。我们将尝试进行无需保留容器的启动测试。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ docker run -i --rm ubuntu echo hello world
hello world
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$

只需显示一个选项,我已经设置为-i选项。

TinyGoをdockerで使う

我会用我现有的知识尝试使用tinygo。我准备一个著名的blink程式。

package main
import (
    "machine"
    "time"
)
func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        led.Low()
        time.Sleep(time.Millisecond * 500)
        led.High()
        time.Sleep(time.Millisecond * 500)
    }
}

在连接XIAO RP2040之前,同时按下[BOOT]按钮。虽然在blink阶段不需要”go mod init”,但最好还是执行一下。

$ docker run -it --mount type=bind,src="$(pwd)",target=/work -w /work --rm tinygo/tinygo go mod init go_xiao
Unable to find image 'tinygo/tinygo:latest' locally

# 途中省略 tinygo/tinygo のイメージがダウンロードされます

go: creating new go.mod: module go_xiao
go: to add module requirements and sums:
	go mod tidy
$ docker run -it --mount type=bind,src="$(pwd)",target=/work -w /work --rm tinygo/tinygo go mod tidy

# 何も表示がないですがこれで準備終了です

$ docker run -it --mount type=bind,src="$(pwd)",target=/work -w /work --rm tinygo/tinygo tinygo build -target=xiao-rp2040 -o=main.uf2 
$ ls
go.mod    main.go   main.uf2*
$ cp main.uf2 /Volumes/RPI-RP2/  # リセットし実行されます

要するに公式の方法と同じですね。

 

bannerAds