non-root user な devcontainer で aqua を使う
non-root user な devcontainer で aqua を使えるようにしてみた。
やったこと
結論だけ欲しい人向け。
- リポジトリに aqua の設定ファイル用のディレクトリを作成する
- aqua でインストールしたパスを実行できるように PATH を通す
- devcontainer の
postCreateCommand
でコンテナ作成後に aqua のセットアップを行うようにする
上記の手順を実行したサンプルを以下のリポジトリに公開する。
m1yam0t0/devcontainer-aqua-sample
はじめに
普段、パッケージの管理に aqua を使っている。
devcontainer でも同様に aqua でインストールしようとしたが、non-root user の場合、イメージ作成時にそのままインストールできない。
公式でaqua を使ったイメージをビルドする方法が紹介されているが、以下の理由もありかゆいところに手が届かない。
- aqua-installer のバージョンが古い(将来的にインストールできなくなってしまう可能性がある)
- non-root user の場合、aqua でバイナリをインストールしてコピーする方法もあるが、ツールの追加の度にビルドが必要になる
- 可能であれば、aqua.yaml を編集後、
aqua i
でインストールできるようにしたい
- 可能であれば、aqua.yaml を編集後、
これを解消するために、non-root user な devcontainer で aqua をインストールできたため手順を紹介する。
手順
aqua の設定ファイルを用意する
以下のような aqua.yaml
を作成する。
mkdir -p aqua
aqua init aqua/aqua.yaml
aqua.yaml
(hugo
をインストールしている)
---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
# enabled: true
# require_checksum: true
# supported_envs:
# - all
registries:
- type: standard
ref: v4.112.0 # renovate: depName=aquaproj/aqua-registry
packages:
- name: gohugoio/hugo@v0.121.1
devcontainer で aqua を使うために、PATH を設定する
以下のような devcontainer の設定ファイル(.devcontainer/devcontainer.json
) を作成する。
{
"name": "Ubuntu",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-22.04",
// aqua でインストールしたツールを実行するために PATH を設定する
"remoteEnv": {
"PATH": "${containerEnv:PATH}:${AQUA_ROOT_DIR:/home/vscode/.local/share/aquaproj-aqua/bin"
},
// devcontainer 作成後に aqua をインストールするようにスクリプトを実行する
"postCreateCommand": "bash .devcontainer/postCreate.sh"
}
自分でイメージを作成したい場合は、devcontainer.json
の remoteEnv
の部分を削除し、
以下のように、Dockerfile 内で ENV
を使って PATH を設定できる。
ARG VARIANT="ubuntu-22.04"
FROM mcr.microsoft.com/devcontainers/base:${VARIANT}
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ENV PATH="/home/$USERNAME/.local/share/aquaproj-aqua/bin:$PATH"
aqua をインストールするためのスクリプト(postCreate.sh
)を作成
aqua-installer | aqua に記載されているインストール手順を実行するスクリプトを用意する。
(non-root user で /usr/local/bin
配下に aqua-installer を移動できないため、インストール後削除している)
#!/usr/bin/env bash
# Install aqua
curl -sSfL -O https://raw.githubusercontent.com/aquaproj/aqua-installer/v2.2.0/aqua-installer
echo "d13118c3172d90ffa6be205344b93e8621de9bf47c852d80da188ffa6985c276 aqua-installer" | sha256sum -c
chmod +x aqua-installer
./aqua-installer
rm -f aqua-installer
# Install tools
aqua i -l
devcontainer の実行
上記の手順を実施後、devcontiner を起動すると、postCreate.sh
が実行され、aqua のインストール処理が進んでいる。
Running the postCreateCommand from devcontainer.json...
...
aqua-installer: OK
[INFO] Installing aqua v2.16.4 for bootstrapping...
...
aqua version 2.21.3 (8ddf104abfab2feb15018280c53ec9936aeff31e)
...
INFO[0001] create a symbolic link aqua_version=2.21.3 command=hugo env=linux/amd64 program=aqua
Done. Press any key to close the terminal.
postCreateCommandの結果全文
Running the postCreateCommand from devcontainer.json...
[8006 ms] Start: Run in container: /bin/sh -c bash .devcontainer/postCreate.sh
aqua-installer: OK
[INFO] Installing aqua v2.16.4 for bootstrapping...
[INFO] Downloading https://github.com/aquaproj/aqua/releases/download/v2.16.4/aqua_linux_amd64.tar.gz ...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 6563k 100 6563k 0 0 3691k 0 0:00:01 0:00:01 --:--:-- 9.9M
[INFO] Verifying checksum of aqua v2.16.4 ...
aqua_linux_amd64.tar.gz: OK
[INFO] /tmp/tmp.kO9BQ4iCpW/aqua update-aqua
INFO[0000] download and unarchive the package aqua_version=2.16.4 env=linux/amd64 new_version=v2.21.3 package_name=aquaproj/aqua package_version=v2.21.3 program=aqua registry=
INFO[0001] verify a package with slsa-verifier aqua_version=2.16.4 env=linux/amd64 new_version=v2.21.3 package_name=aquaproj/aqua package_version=v2.21.3 program=aqua registry=
INFO[0001] download and unarchive the package aqua_version=2.16.4 env=linux/amd64 new_version=v2.21.3 package_name=slsa-framework/slsa-verifier package_version=v2.4.0 program=aqua registry=
Verified signature against tlog entry index 58059425 at URL: https://rekor.sigstore.dev/api/v1/log/entries/24296fb24b8ad77a82d2eb6e3208e60e4ebcfba78c1478ec3585b5f5c6dd5b71b4fe36d2120793f3
Verified build using builder "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.9.0" at commit 8ddf104abfab2feb15018280c53ec9936aeff31e
Verifying artifact /tmp/433352795: PASSED
PASSED: Verified SLSA provenance
INFO[0010] create a symbolic link aqua_version=2.16.4 command=aqua env=linux/amd64 new_version=v2.21.3 package_name=aquaproj/aqua package_version=v2.21.3 program=aqua
===============================================================
[INFO] aqua is installed into /home/vscode/.local/share/aquaproj-aqua/bin/aqua
[INFO] Please add the path to the environment variable "PATH"
[INFO] export PATH=${AQUA_ROOT_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/aquaproj-aqua}/bin:$PATH
===============================================================
aqua version 2.21.3 (8ddf104abfab2feb15018280c53ec9936aeff31e)
INFO[0000] download and unarchive the package aqua_version=2.21.3 env=linux/amd64 package_name=aqua-proxy package_version=v1.2.4 program=aqua registry=
INFO[0001] create a symbolic link aqua_version=2.21.3 command=aqua-proxy env=linux/amd64 package_name=aqua-proxy package_version=v1.2.4 program=aqua registry=
INFO[0001] create a symbolic link aqua_version=2.21.3 command=hugo env=linux/amd64 program=aqua
Done. Press any key to close the terminal.
aqua でインストールした hugo も実行できるようになっている。
vscode ➜ /workspaces/devcontainer-aqua-sample $ hugo --version
INFO[0000] download and unarchive the package aqua_version=2.21.3 env=linux/amd64 exe_name=hugo package_name=gohugoio/hugo package_version=v0.121.1 program=aqua registry=standard
hugo v0.121.1-00b46fed8e47f7bb0a85d7cfc2d9f1356379b740 linux/amd64 BuildDate=2023-12-08T08:47:45Z VendorInfo=gohugoio
この状態で aqua.yaml
に設定を追加すると、イメージの再ビルドを行わずにツールをインストールできた。
vscode ➜ /workspaces/devcontainer-aqua-sample $ aqua g cli/cli >> aqua/aqua.yaml
vscode ➜ /workspaces/devcontainer-aqua-sample $ aqua i -l
INFO[0000] create a symbolic link aqua_version=2.21.3 command=gh env=linux/amd64 program=aqua
vscode ➜ /workspaces/devcontainer-aqua-sample $ gh version
INFO[0000] download and unarchive the package aqua_version=2.21.3 env=linux/amd64 exe_name=gh package_name=cli/cli package_version=v2.40.1 program=aqua registry=standard
gh version 2.40.1 (2023-12-13)
https://github.com/cli/cli/releases/tag/v2.40.1
さいごに
non-root な devcontainer でも、aqua を使ってツールをインストールできた。
他にも、Dev Container Features という、devcontainer.json
に追加するだけで必要なツールをインストールできる機能がある。
2023年12月31日現在、aqua をインストールするための feature は公式で提供されていない。
features を作成するサンプルも用意されているので、自作してこちらの方法でインストールをしたほうが良いかもしれない。