2025年10月17日金曜日

werf 超入門

werf 超入門

概要

kaniko がメンテされなくなり代わりのイメージビルドツールに werf というツールがあったので試してみました

環境

  • Ubuntu 24.04
  • werf 2.45.1

インストール

  • curl -sSL https://werf.io/install.sh | bash -s -- --version 2 --channel stable

.bashrc などに設定が記載されるのでターミナルを開きなおせば werf コマンドが使えるようになります

$ werf version
v2.45.1

werf.yaml の作成

  • vim werf.yaml
project: lab
configVersion: 1
---
image: test
context: .
dockerfile: Dockerfile

Dockerfile はプロジェクトの直下にあるものとします

werf.yaml の追加

werf.yaml はコミットされていないと認識されないので先にコミットします
リモート側に push まではしなくて OK です

  • git add .
  • git commit -m “Add werf.yaml”

ビルド

  • werf build

以下のように実行されます

Version: v2.45.1
WARNING: unable to parse ssh key /home/devops/.ssh/id_dsa: error parsing private key /home/devops/.ssh/id_dsa: ssh: unhandled key type
Using werf config render file: /tmp/werf-config-render-2657037271

┌ ???   (1/1) image test
│ ┌ Building stage test/dockerfile
│ │ test/dockerfile  #0 building with "default" instance using docker driver
│ │ test/dockerfile
│ │ test/dockerfile  #1 [internal] load remote build context
│ │ test/dockerfile  #1 DONE 0.1s
│ │ test/dockerfile
│ │ test/dockerfile  #2 copy /context /
│ │ test/dockerfile  #2 DONE 0.0s
│ │ test/dockerfile
│ │ test/dockerfile  #3 [internal] load metadata for docker.io/library/python:3.12.11-slim-bookworm
│ │ test/dockerfile  #3 ...
│ │ test/dockerfile
│ │ test/dockerfile  #4 [auth] library/python:pull token for registry-1.docker.io
│ │ test/dockerfile  #4 DONE 0.0s
│ │ test/dockerfile
│ │ test/dockerfile  #3 [internal] load metadata for docker.io/library/python:3.12.11-slim-bookworm
│ │ test/dockerfile  #3 DONE 2.7s
│ │ test/dockerfile
│ │ test/dockerfile  #5 [1/2] FROM docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7
│ │ test/dockerfile  #5 resolve docker.io/library/python:3.12.11-slim-bookworm@sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 done
│ │ test/dockerfile  #5 sha256:519591d6871b7bc437060736b9f7456b8731f1499a57e22e6c285135ae657bf7 9.13kB / 9.13kB done
│ │ test/dockerfile  #5 sha256:c00fc7b44d844b6da22861ec24af43968a5200eac4ec607b4725d585165d6b49 1.75kB / 1.75kB done
│ │ test/dockerfile  #5 sha256:688a685f6a1fa9250d7c6cee916889cbca364e4b027520110e0fce80c64a13e0 5.60kB / 5.60kB done
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 0B / 28.23MB 0.1s
│ │ test/dockerfile  #5 sha256:229c2e83adbca32a7582f378ce5a103e5c327ffd945d3f451fe66d1886693f34 0B / 3.52MB 0.1s
│ │ test/dockerfile  #5 sha256:d296ae3a1b166ec8b25480749804c463ffde8dd56bd4a0d938c764b93565254e 0B / 13.66MB 0.1s
│ │ test/dockerfile  #5 sha256:229c2e83adbca32a7582f378ce5a103e5c327ffd945d3f451fe66d1886693f34 3.52MB / 3.52MB 0.6s done
│ │ test/dockerfile  #5 sha256:5ac70eb707d38d47fc69ca91acd4de7256ef894f5f446a9c344a1f4ad7628114 0B / 250B 0.6s
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 2.10MB / 28.23MB 0.9s
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 11.53MB / 28.23MB 1.1s
│ │ test/dockerfile  #5 sha256:d296ae3a1b166ec8b25480749804c463ffde8dd56bd4a0d938c764b93565254e 4.19MB / 13.66MB 1.1s
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 14.68MB / 28.23MB 1.2s
│ │ test/dockerfile  #5 sha256:d296ae3a1b166ec8b25480749804c463ffde8dd56bd4a0d938c764b93565254e 7.50MB / 13.66MB 1.2s
│ │ test/dockerfile  #5 sha256:5ac70eb707d38d47fc69ca91acd4de7256ef894f5f446a9c344a1f4ad7628114 250B / 250B 1.1s done
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 16.78MB / 28.23MB 1.4s
│ │ test/dockerfile  #5 sha256:d296ae3a1b166ec8b25480749804c463ffde8dd56bd4a0d938c764b93565254e 13.66MB / 13.66MB 1.3s done
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 23.07MB / 28.23MB 1.5s
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 28.23MB / 28.23MB 1.6s
│ │ test/dockerfile  #5 extracting sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375
│ │ test/dockerfile  #5 sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 28.23MB / 28.23MB 1.6s done
│ │ test/dockerfile  #5 extracting sha256:5c32499ab806884c5725c705c2bf528662d034ed99de13d3205309e0d9ef0375 1.6s done
│ │ test/dockerfile  #5 extracting sha256:229c2e83adbca32a7582f378ce5a103e5c327ffd945d3f451fe66d1886693f34
│ │ test/dockerfile  #5 extracting sha256:229c2e83adbca32a7582f378ce5a103e5c327ffd945d3f451fe66d1886693f34 0.2s done
│ │ test/dockerfile  #5 extracting sha256:d296ae3a1b166ec8b25480749804c463ffde8dd56bd4a0d938c764b93565254e
│ │ test/dockerfile  #5 extracting sha256:d296ae3a1b166ec8b25480749804c463ffde8dd56bd4a0d938c764b93565254e 0.8s done
│ │ test/dockerfile  #5 extracting sha256:5ac70eb707d38d47fc69ca91acd4de7256ef894f5f446a9c344a1f4ad7628114 done
│ │ test/dockerfile  #5 DONE 4.6s
│ │ test/dockerfile
│ │ test/dockerfile  #6 [2/2] RUN python -V
│ │ test/dockerfile  #6 0.496 Python 3.12.11
│ │ test/dockerfile  #6 DONE 0.8s
│ │ test/dockerfile
│ │ test/dockerfile  #7 exporting to image
│ │ test/dockerfile  #7 exporting layers 0.0s done
│ │ test/dockerfile  #7 writing image sha256:9b378fddd07c7546217a3ec2dba912453034e050f7a642d2052aa472fe085408 done
│ │ test/dockerfile  #7 naming to docker.io/library/9107100b-cef7-4f0a-9a66-49d3dbfe2bed done
│ │ test/dockerfile  #7 DONE 0.1s
│ │ ┌ Store stage into :local
│ │ └ Store stage into :local (0.01 seconds)
│ ├ Info
│ │      name: lab:594be819ed90f0081179a4a268c6045413df7b83b21e1a225badccdd-1760658483401
│ │        id: 9b378fddd07c
│ │   created: 2025-10-17 08:48:03.293806991 +0900 JST
│ │      size: 118.5 MiB
│ └ Building stage test/dockerfile (8.66 seconds)
└ ???   (1/1) image test (9.05 seconds)

Running time 9.30 seconds

以下のようなイメージができれば OK です

docker images
REPOSITORY            TAG                                                                      IMAGE ID       CREATED              SIZE
lab                   594be819ed90f0081179a4a268c6045413df7b83b21e1a225badccdd-1760658483401   9b378fddd07c   About a minute ago   124MB

プッシュする

ビルドしたイメージをプッシュするには --repo オプションを使います
例えば gitlab であれば以下のようにします

  • werf build --repo container-registry.your-gitlab-address/username-or-groupname/repo-name

コンテナレジストリのアドレス/ユーザ名orグループ名/gitlabのリポジトリ名 で指定します
実行すると以下のように gitlab に push されていることが確認できます

Version: v2.45.1
WARNING: unable to parse ssh key /home/devops/.ssh/id_dsa: error parsing private key /home/devops/.ssh/id_dsa: ssh: unhandled key type
Using werf config render file: /tmp/werf-config-render-2317128975

┌ ???   (1/1) image test
│ ┌ Copy suitable stage from secondary :local
│ │ Use previously built image for test/dockerfile
│ │      name: container-registry.your-gitlab-address/username-or-groupname/repo-name:594be819ed90f0081179a4a268c6045413df7b83b21e1a225badccdd-1760658483401
│ │        id: 9b378fddd07c
│ │   created: 2025-10-17 08:48:03 +0900 JST
│ │      size: 44.2 MiB
│ └ Copy suitable stage from secondary :local (18.60 seconds)
└ ???   (1/1) image test (19.27 seconds)

Running time 28.24 seconds

docker images を見ると先ほどビルドしたイメージに gitlab にプッシュするためのタグが作成されてそれがプッシュされていることが確認できます

コンテナレジストリにログインしていない場合は

以下のようなエラーになります

Error: unable to init storage manager: error get synchronization: unable to init http synchronization: unable to get client id for the http synchronization server: unable to get repo container-registry.your-gitlab-address/username-or-groupname/repo-name tags: unable to fetch tags for repo "container-registry.your-gitlab-address/username-or-groupname/repo-name": reading tags for "container-registry.your-gitlab-address/username-or-groupname/repo-name": GET https://xxx/jwt/auth?scope=repository%3Ausername-or-group%2Frepo-name%3Apull&service=container_registry: DENIED: access forbidden

素直に docker login すれば OK です

  • docker login container-registry.your-gitlab-address

タグを設定するには

werf はデフォルトだと UUID のようなランダムな文字列をタグとして付与します
latest やバージョンなど独自のタグを付与して push したい場合には以下のようにします

  • werf build --repo container-registry.your-gitlab-address/username-or-groupname/repo-name --add-custom-tag latest --add-custom-tag hoge

--add-custom-tag を使います
--add-custom-tag は複数指定できます
以下のように複数のタグが push されていることが確認できます

Version: v2.45.1
WARNING: unable to parse ssh key /home/devops/.ssh/id_dsa: error parsing private key /home/devops/.ssh/id_dsa: ssh: unhandled key type
Using werf config render file: /tmp/werf-config-render-4112436980

┌ ???   (1/1) image test
│ ┌ Copy suitable stage from secondary :local
│ │ Use previously built image for test/dockerfile
│ │      name: container-registry.your-gitlab-address/username-or-groupname/repo-name:594be819ed90f0081179a4a268c6045413df7b83b21e1a225badccdd-1760658483401
│ │        id: 9b378fddd07c
│ │   created: 2025-10-17 08:48:03 +0900 JST
│ │      size: 44.2 MiB
│ └ Copy suitable stage from secondary :local (2.14 seconds)
└ ???   (1/1) image test (2.90 seconds)

┌ Adding custom tags
│ ┌ tag latest
│ │   name: container-registry.your-gitlab-address/username-or-groupname/repo-name:latest
│ └ tag latest (3.27 seconds)
│
│ ┌ tag hoge
│ │   name: container-registry.your-gitlab-address/username-or-groupname/repo-name:hoge
│ └ tag hoge (3.23 seconds)
└ Adding custom tags (6.51 seconds)

Running time 17.49 seconds

最後に

kaniko の代用として werf を使ってみました
kaniko のようにビルド -> プッシュを一回のコマンドでできるは良い点です
次回は GitlabCI で werf を使ってみます

参考サイト

0 件のコメント:

コメントを投稿