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の入門書を執筆したりしてます
    2025 Japan AWS Top Engineer
    AWS Community Builder - Containers

    Twitter:@jstozw

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