NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

DockerDesktopの代替になるかも?と巷で話題の「Finch」を使ってみた

本記事は NRIネットコム Advent Calendar 2022 18日目の記事です。
🎁 17日目 ▶▶本記事 ▶▶ 19日目 🎄

ども、尾澤です。めっきり寒くなりました。
Techブログ登場は2回目です。

このブログが公開される頃には決勝進出チームが決まり、
3位決定戦が終わっている頃でしょう。
私の決勝予想はFRA or BRZ ... と、予想していましたが、 BRZはベスト8で姿を消しました。。。がんばれFRA。

Finch とは

近年ライセンス料金改定によって経営陣の頭を悩ませている(?)Docker Desktopですが、
その代替になりうるツールと呼ばれているのが「Finch」です。(読み方わからん)

2022年11月にAWSからオープンソースとして公開されました。
https://github.com/runfinch

ちょっとドキュメント読んでみる

というわけでfinchのREADMEを読んでみます。
https://github.com/runfinch/finch

Hello, Finch

中身としてはnerdctlベースらしいです。

Getting Started with Finch on macOS

どうも現時点ではmacOSしかサポートしていなさそうです。

Installing Finch

リソース的な制約は下記です。

  • macOS catalina (10.15) 以上
  • IntelCPUでも使える
  • 最低でも 2 CPU、メモリ 4 GiB 以上

Running containers and building images

コマンドが全部 finch に置き換わってるだけで、操作感はdockerとあまり変わらなさそう。

Working with Finch

-v オプションは使えそうだけど $HOME 外でやると想定外の挙動になりそうなのでやめてね、とのこと。

${HOME}/.finch/finch.yaml で finch が起動する仮想マシン(VM)へのリソース割り当てを指定できるそう。

What's next?

一応他OS(Windows, Linux)への展開は考えられていそうでした。

早速入れてみる

物は試し。インストールします。
現在はbrewからでもインストール可能のようです。
今回はパッケージを使います。下記からダウンロードします。
https://github.com/runfinch/finch/releases

まぁこんな感じです。

インストールが完了したらこんなのが出ます。

まずは finch vm init でVMを起動しろとのことです。やってみます。

❯ finch vm init
INFO[0000] Using default values due to missing config file at "/Users/k-ozawa/.finch/finch.yaml"
INFO[0000] "/Users/k-ozawa/.finch" directory doesn't exist, attempting to create it
INFO[0001] binaries directory doesn't exist
INFO[0001] Requesting root access to finish network dependency configuration
INFO[0001] sudoers file not found: %!w(*fs.PathError=&{open /etc/sudoers.d/finch-lima 2})
INFO[0002] Initializing and starting Finch virtual machine...
INFO[0203] Finch virtual machine started successfully

起動したっぽいです。所要時間は3分ほどです。

このタイミングで$HOMEに.finchディレクトリが作成され、finch.yamlが配置されます。

➜ cat ~/.finch/finch.yaml
cpus: 2
memory: 4GiB

デフォルトだと最小で必要になるリソース割り当てになってそうです。

ちなみにVMはlimaで動いているようです。
https://github.com/lima-vm/lima

動作確認

ちゃんと動くかどうか、READMEのサンプルコマンドで試してみます。
https://github.com/runfinch/finch#running-containers-and-building-images

➜ finch run --rm public.ecr.aws/finch/hello-finch
public.ecr.aws/finch/hello-finch:latest:                                          resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:a71e474da9ffd6ec3f8236dbf4ef807dd54531d6f05047edaeefa758f1b1bb7e:    done           |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:2f848edb93f7d0cfa20d7dc7add84586fe06d258d6dd54422d8015c584ff3b9e: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:50c36f221209ea6829db90eff11db167d8cc22abf7c2c0f1e7f4a0c701c0592f:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:cb7e3bc996dd3208c5b4560d5f6571486e2fe90b5a1cc384e2d6af0dc07de02a:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 4.7 s                                                                    total:  1.0 Mi (226.3 KiB/s)

                            @@@@@@@@@@@@@@@@@@@
                        @@@@@@@@@@@@    @@@@@@@@@@@
                      @@@@@@@                  @@@@@@@
                    @@@@@@                        @@@@@@
                  @@@@@@                            @@@@@
                 @@@@@                      @@@#     @@@@@@@@@
                @@@@@                     @@   @@@       @@@@@@@@@@
                @@@@%                     @     @@            @@@@@@@@@@@
                @@@@                                               @@@@@@@@
                @@@@                                         @@@@@@@@@@@&
                @@@@@                                  &@@@@@@@@@@@
                 @@@@@                               @@@@@@@@
                  @@@@@                            @@@@@(
                   @@@@@@                        @@@@@@
                     @@@@@@@                  @@@@@@@
                        @@@@@@@@@@@@@@@@@@@@@@@@@@
                            @@@@@@@@@@@@@@@@@@

Hello from Finch!

Visit us @ github.com/runfinch

動きました!(このAAなに???と思ったらアイコンのAAでした。遠目で見たらわかる)

ちなみにコマンドヘルプはこんな感じです。

➜ finch -h
Finch: open-source container development tool

Usage:
  finch [command]

Available Commands:
  build       Build an image from Dockerfile
  builder     Manage builds
  commit      Create a new image from a container's changes
  completion  Generate the autocompletion script for the specified shell
  compose     Compose
  container   Manage containers
  create      Create a new container
  events      Get real time events from the server
  exec        Run a command in a running container
  help        Help about any command
  history     Show the history of an image
  image       Manage images
  images      List images
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a container registry
  logout      Log out from a container registry
  logs        Fetch the logs of a container
  network     Manage networks
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image from a registry
  push        Push an image or a repository to a registry
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  system      Manage containerd
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show Finch version information
  vm          Manage the virtual machine lifecycle
  volume      Manage volumes
  wait        Block until one or more containers stop, then print their exit codes

Flags:
      --debug     running under debug mode
  -h, --help      help for finch
  -v, --version   version for finch

Use "finch [command] --help" for more information about a command.

ぱっと見はほとんどDockerそのまま流用できそうな感じです。

ちなみにdockerのヘルプはこんな感じです。

❯ docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/Users/k-ozawa/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default
                           context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/Users/k-ozawa/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/Users/k-ozawa/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/Users/k-ozawa/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  buildx*     Docker Buildx (Docker Inc., v0.9.1)
  compose*    Docker Compose (Docker Inc., v2.12.1)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  dev*        Docker Dev Environments (Docker Inc., v0.0.3)
  extension*  Manages Docker extensions (Docker Inc., v0.2.13)
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  sbom*       View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
  scan*       Docker Scan (Docker Inc., v0.21.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

To get more help with docker, check out our guides at https://docs.docker.com/go/guides/

うん、、なんかやっぱ洗練されてる感はありますね。

hello-finch をローカルビルドしてみる

finch のソースコードをクローンして、ローカルでビルドしてみます。

➜ git clone https://github.com/runfinch/finch.git
Cloning into 'finch'...
remote: Enumerating objects: 362, done.
remote: Counting objects: 100% (138/138), done.
remote: Compressing objects: 100% (84/84), done.
remote: Total 362 (delta 98), reused 63 (delta 54), pack-reused 224
Receiving objects: 100% (362/362), 262.75 KiB | 2.05 MiB/s, done.
Resolving deltas: 100% (176/176), done.

build

➜ cd ./finch/contrib/hello-finch

➜ finch build . -t hello-finch
[+] Building 126.8s (11/11) FINISHED
 => [internal] load build definition from Dockerfile                                                                         0.2s
 => => transferring dockerfile: 322B                                                                                         0.0s
 => [internal] load .dockerignore                                                                                            0.2s
 => => transferring context: 2B                                                                                              0.0s
 => [internal] load metadata for public.ecr.aws/docker/library/golang:1.19                                                   4.8s
 => [builder 1/4] FROM public.ecr.aws/docker/library/golang:1.19@sha256:dc76ef03e54c34a00dcdca81e55c242d24b34d231637776c4  100.3s
 => => resolve public.ecr.aws/docker/library/golang:1.19@sha256:dc76ef03e54c34a00dcdca81e55c242d24b34d231637776c4bb5c1a8e85  0.1s
 => => sha256:14a70245b07c7f5056bdd90a3d93e37417ec26542def5a37ac8f19e437562533 0B / 156B                                   120.8s
 => => sha256:52908dc1c386fab0271a2b84b6ef4d96205a98a8c8801169554767172e45d8c7 84.93MB / 85.97MB                           120.7s
 => => sha256:a2b47720d601b6c6c6e7763b4851e25475118d80a76be466ef3aa388abf2defd 148.91MB / 148.91MB                         120.7s
 => => sha256:195ea6a58ca87a18477965a6e6a8623112bde82c5b568a29c56ce4581b6e6695 54.59MB / 54.59MB                           120.7s
 => => sha256:c85a0be79bfba309d1f05dc40b447aa82b604593531fed1e7e12e4bef63483a5 10.49MB / 10.88MB                           120.4s
 => => sha256:e4e46864aba2e62ba7c75965e4aa33ec856ee1b1074dda6b478101c577b63abd 4.19MB / 5.16MB                             112.0s
 => => sha256:a8ca11554fce00d9177da2d76307bdc06df7faeb84529755c648ac4886192ed1 54.53MB / 55.04MB                           108.8s
 => => extracting sha256:a8ca11554fce00d9177da2d76307bdc06df7faeb84529755c648ac4886192ed1                                    6.9s
 => => extracting sha256:e4e46864aba2e62ba7c75965e4aa33ec856ee1b1074dda6b478101c577b63abd                                    1.1s
 => => extracting sha256:c85a0be79bfba309d1f05dc40b447aa82b604593531fed1e7e12e4bef63483a5                                    0.9s
 => => extracting sha256:195ea6a58ca87a18477965a6e6a8623112bde82c5b568a29c56ce4581b6e6695                                   11.0s
 => => extracting sha256:52908dc1c386fab0271a2b84b6ef4d96205a98a8c8801169554767172e45d8c7                                    7.8s
 => => extracting sha256:a2b47720d601b6c6c6e7763b4851e25475118d80a76be466ef3aa388abf2defd                                   16.5s
 => => extracting sha256:14a70245b07c7f5056bdd90a3d93e37417ec26542def5a37ac8f19e437562533                                    0.1s
 => [internal] load build context                                                                                            0.4s
 => => transferring context: 2.16kB                                                                                          0.0s
 => [builder 2/4] WORKDIR /build                                                                                             0.1s
 => [builder 3/4] COPY . .                                                                                                   0.2s
 => [builder 4/4] RUN CGO_ENABLED=0 go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o hello-finch .        20.0s
 => [stage-1 1/2] COPY --from=builder /build/hello-finch /app/                                                               0.1s
 => [stage-1 2/2] WORKDIR /app                                                                                               0.2s
 => exporting to oci image format                                                                                            0.8s
 => => exporting layers                                                                                                      0.4s
 => => exporting manifest sha256:8cc472a48ea9307963711d35574536d6f960880468e9eebb5d134d7c98410f51                            0.0s
 => => exporting config sha256:b25c674348c46c04ee73175c18ee1de5568ddc750d7297e97d5571718817eded                              0.0s
 => => sending tarball                                                                                                       0.3s
unpacking docker.io/library/hello-finch:latest (sha256:8cc472a48ea9307963711d35574536d6f960880468e9eebb5d134d7c98410f51)...
Loaded image: docker.io/library/hello-finch:latest

当方のネットワーク環境が調子悪くてpullにめっちゃ時間かかりましたが、、、 ビルドできました。

イメージの確認は finch images でできます。

➜ finch images
REPOSITORY                          TAG       IMAGE ID        CREATED           PLATFORM       SIZE       BLOB SIZE
hello-finch                         latest    8cc472a48ea9    56 seconds ago    linux/amd64    1.7 MiB    1.0 MiB

ComposeなNginxを起動してみる

下記のようなdocker-compose.ymlを配置して、composeでデーモン起動させます。

Finch使ってるのにDocker Hubからイメージ拝借するのはなんだか気が引けたので ←
NginxイメージはECR Public Garellyから拝借しました。

version: "3"
services:
  nginx:
    image: public.ecr.aws/nginx/nginx:1.23-alpine
    container_name: finch-nginx
    ports:
      - "80:80"

compose サブコマンドを使います。

➜ finch compose up -d
INFO[0000] Creating network finch_default
INFO[0000] Ensuring image public.ecr.aws/nginx/nginx:1.23-alpine
public.ecr.aws/nginx/nginx:1.23-alpine:                                           resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd9334930aa81:    done           |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:0f2ab24c6aba5d96fcf6e7a736333f26dca1acf5fa8def4c276f6efc7d56251f: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:19dd4d73108a1feefc29d299f3727467ac02486c83474fc3979e4a7637291fe6:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:2f12a0e7c01d607251a4040fa41518fd2542f3ebab83a6f7817867d0de111c96:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4342b1ab302e894161372b32fe2976899a978bf8ff2241fb1655dc25e6645a34:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:ca7dd9ec2225f2385955c43b2379305acd51543c28cf1d4e94522b3d94cce3ce:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:1a7b9b9bbef6853211515e42f58be7763749950c244a0c485bb4afd1946e06d7:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:76a48b0f58980a64d28bc3575ae4733eb337f7b82403559122b13d5e2ced3921:    done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:b704883c57afcf77f6bc48709943bcf808c9e9945d7e04926be41226fa415d33:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 10.2s                                                                    total:  7.1 Mi (710.6 KiB/s)
INFO[0010] Creating container finch-nginx

➜ finch compose ps
NAME           COMMAND                   SERVICE    STATUS     PORTS
finch-nginx    "/docker-entrypoint.…"    nginx      running    0.0.0.0:80->80/tcp

起動しました。コンテナにログインしてみます。

➜ finch compose exec finch-nginx /bin/sh
FATA[0000] unknown subcommand "exec" for "compose"
FATA[0000] exit status 1

❯ finch compose -h
Compose

Usage: finch compose [flags]

Commands:
  build    Build or rebuild services
  config   Validate and view the Compose file
  down     Remove containers and associated resources
  kill     Force stop service containers
  logs     Show logs of a running container
  ps       List containers of services
  pull     Pull service images
  push     Push service images
  run      Run a one-off command on a service
  up       Create and start containers
  version  Show the Compose version information

Flags:
      --env-file string            Specify an alternate environment file
  -f, --f stringArray              Alias of --file
      --file stringArray           Specify an alternate compose file
  -h, --help                       help for compose
      --project-directory string   Specify an alternate working directory
  -p, --project-name string        Specify an alternate project name

See also 'finch --help' for the global flags such as '--namespace', '--snapshotter', and '--cgroup-manager'.

おっと、execオプションがなさそうでした。

どうもfinchコマンドのexecオプションで叩くしかなさそうでしたので、それでやってみます。

➜ finch exec -it finch-nginx /bin/sh
/ # 

入れました。

ここで細かいことに気づきましたが、
コンテナからexitする際によく Ctrl + P + Q を使っていたんですが、
finch ではそれが使えませんでした。

ここは現状 Ctrl + D とかでexitするしかなさそうです。

その他気になったところ

pruneしたい時はどうする?

docker prune ~のようなコマンドは存在しませんが、
system,image,volume等の各サブコマンドのオプションとしてpruneが存在するので、こちらで実施できそうです。

➜ finch system -h
Manage containerd

Usage: finch system [flags]

Commands:
  events  Get real time events from the server
  info    Display system-wide information
  prune   Remove unused data

Flags:
  -h, --help   help for system

See also 'finch --help' for the global flags such as '--namespace', '--snapshotter', and '--cgroup-manager'.

finch環境を削除/停止したい

vm サブコマンドで仮想マシン環境の削除/停止が可能です

# 削除
finch vm remove

# 停止
finch vm stop

コンテナへのproxy情報の渡し方

試しに下記のようにapkで更新する感じのDockerfileを書いてビルドしてみます。

FROM public.ecr.aws/nginx/nginx:1.23-alpine

RUN apk update && \
  apk upgrade

build

➜ finch build . -t finch-nginx
[+] Building 15.7s (5/5) FINISHED
 => [internal] load build definition from Dockerfile                                                                         0.1s
 => => transferring dockerfile: 116B                                                                                         0.0s
 => [internal] load .dockerignore                                                                                            0.1s
 => => transferring context: 2B                                                                                              0.0s
 => [internal] load metadata for public.ecr.aws/nginx/nginx:1.23-alpine                                                      0.8s
 => CACHED [1/2] FROM public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd93  0.1s
 => => resolve public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd9334930aa  0.1s
 => ERROR [2/2] RUN apk update &&   apk upgrade                                                                             14.7s
------
 > [2/2] RUN apk update &&   apk upgrade:
#0 0.217 fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/main/x86_64/APKINDEX.tar.gz
#0 6.405 ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.16/main: network error (check Internet connection and firewall)
#0 6.405 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.16/main: No such file or directory
#0 6.406 fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/community/x86_64/APKINDEX.tar.gz
#0 13.59 ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.16/community: network error (check Internet connection and firewall)
#0 13.59 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.16/community: No such file or directory
#0 13.59 2 errors; 42 distinct packages available
------
Dockerfile:3
--------------------
   2 |
   3 | >>> RUN apk update && \
   4 | >>>   apk upgrade
   5 |
--------------------
error: failed to solve: process "/bin/sh -c apk update &&   apk upgrade" did not complete successfully: exit code: 2
FATA[0015] unrecognized image format
FATA[0016] exit status 1
#0 6.401 ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.16/main: network error (check Internet connection and firewall)

と言われてしまっているので、ビルドシーケンスでどうもproxyを超えられていなさそうです。

こういった場合、
Docker Desktopではダッシュボードないしconfig.jsonでproxy情報を定義してあげると、
コンテナ側にもそれが読み取られるようになっていますが、
finchの場合はそういった機能がなさそうでした。

試しに $HOME/.finch/finch.yml で propagateProxyEnv: true を設定したらいけるかな?と思いましたが、
finch vm stop の段階でyml情報がサラぴんに戻ってしまうので、これで設定は無理そうでした。

なので今回はDockerfileにARG句を追記してコマンドからゴリ押しでproxy情報を渡します。

追記したDockerfileはこちら

FROM public.ecr.aws/nginx/nginx:1.23-alpine

# proxy情報をbuild-argから読み込む
ARG HTTP_PROXY
ARG HTTPS_PROXY

RUN apk update && \
  apk upgrade

—build-arg オプションでproxy情報を渡します。

➜ finch build . -t finch-nginx \
--build-arg HTTP_PROXY=$http_proxy \
--build-arg HTTPS_PROXY=$https_proxy
[+] Building 7.6s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                                                                         0.1s
 => => transferring dockerfile: 148B                                                                                         0.0s
 => [internal] load .dockerignore                                                                                            0.1s
 => => transferring context: 2B                                                                                              0.0s
 => [internal] load metadata for public.ecr.aws/nginx/nginx:1.23-alpine                                                      0.7s
 => CACHED [1/2] FROM public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd93  0.1s
 => => resolve public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd9334930aa  0.1s
 => [2/2] RUN apk update &&   apk upgrade                                                                                    3.4s
 => exporting to oci image format                                                                                            3.3s
 => => exporting layers                                                                                                      0.5s
 => => exporting manifest sha256:86c728fb876af03a0023689b830311edaa2ec05c235efc197bded2fe988de32a                            0.0s
 => => exporting config sha256:14b44aa61eafdd7d47aca3f46feaa2d36779d850b35235cf7eaf5ee81cef5533                              0.0s
 => => sending tarball                                                                                                       2.7s
unpacking docker.io/library/finch-nginx:latest (sha256:86c728fb876af03a0023689b830311edaa2ec05c235efc197bded2fe988de32a)...
Loaded image: docker.io/library/finch-nginx:latest

無事、通りました。

当面はプロキシ環境下においては、ビルド時に引数でプロキシ情報を渡してあげるという一手間が必要になりそうです。

BuildKitも使えるらしい

ドキュメントを読む感じだとnerdctlがデフォルトでBuiidKit使えそうなので、
とりあえず下記のようなmountオプションを追記してビルドしてみます。
syntaxも特に記載しなくて良さそうです。

FROM public.ecr.aws/nginx/nginx:1.23-alpine

ARG HTTP_PROXY
ARG HTTPS_PROXY

RUN --mount=type=cache,uid=1000,target=/var/cache/apk \  # ←ここ
  apk update && \
  apk upgrade

build

❯ finch build . -t finch-nginx \
--build-arg HTTP_PROXY=$http_proxy \
--build-arg HTTPS_PROXY=$https_proxy
[+] Building 6.5s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                         0.1s
 => => transferring dockerfile: 204B                                                                                         0.0s
 => [internal] load .dockerignore                                                                                            0.1s
 => => transferring context: 2B                                                                                              0.0s
 => [internal] load metadata for public.ecr.aws/nginx/nginx:1.23-alpine                                                      0.7s
 => CACHED [internal] settings cache mount permissions                                                                       0.0s
 => CACHED [stage-0 1/2] FROM public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c  0.1s
 => => resolve public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd9334930aa  0.1s
 => [stage-0 2/2] RUN --mount=type=cache,uid=1000,target=/var/cache/apk   apk update &&   apk upgrade                        3.7s
 => exporting to oci image format                                                                                            2.0s
 => => exporting layers                                                                                                      0.2s
 => => exporting manifest sha256:a476b49103d2ac577b2a90adf3befdcc3d9044faf53d6eb1e77e21239052cab1                            0.0s
 => => exporting config sha256:caf5fdb12d04593ec11f65a5fe23b2fee6354943238eec39f85b81f897d96d5b                              0.0s
 => => sending tarball                                                                                                       1.6s
unpacking docker.io/library/finch-nginx:latest (sha256:a476b49103d2ac577b2a90adf3befdcc3d9044faf53d6eb1e77e21239052cab1)...
Loaded image: docker.io/library/finch-nginx:latest

下記のようになっているのでBuildKitは効いていそうです。

 => CACHED [internal] settings cache mount permissions                                                                       0.0s
 => CACHED [stage-0 1/2] FROM public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c  0.1s
 => => resolve public.ecr.aws/nginx/nginx:1.23-alpine@sha256:add3eb26b0c39784668b50ade995b6ef725cb32eaa9637c4728bd9334930aa  0.1s
 => [stage-0 2/2] RUN --mount=type=cache,uid=1000,target=/var/cache/apk   apk update &&   apk upgrade                        3.7s
 => exporting to oci image format

まとめ

操作感はdockerと変わらず使えそうでした。
なのでローカルでコンテナ起動するくらいならfinch使うでも問題なさそうです。

ただ、社内ネットワーク等からプロキシを経由した場合は古典的な一手間が必要になるので、
この辺りは実用化に向けての課題になるかなーと感じています。

今後、AWSとの連携が強化されていくらしいので、
ECSへの容易な展開とか色々便利機能が追加されると良いなー
と期待しています。

執筆者尾澤公亮

しがないインフラエンジニアです
AWSの入門書を執筆したりしてます

Twitter:@jstozw

Amazon 著者ページ:尾澤 公亮:作品一覧、著者略歴 - Amazon.co.jp