non-root user な devcontainer で aqua を使う

Date: 2023/12/30
Tags: Aqua Devcontainer Rootless

non-root user な devcontainer で aqua を使えるようにしてみた。

やったこと

結論だけ欲しい人向け。

上記の手順を実行したサンプルを以下のリポジトリに公開する。
m1yam0t0/devcontainer-aqua-sample

はじめに

普段、パッケージの管理に aqua を使っている。
devcontainer でも同様に aqua でインストールしようとしたが、non-root user の場合、イメージ作成時にそのままインストールできない。

公式でaqua を使ったイメージをビルドする方法が紹介されているが、以下の理由もありかゆいところに手が届かない。

これを解消するために、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.jsonremoteEnv の部分を削除し、
以下のように、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 を作成するサンプルも用意されているので、自作してこちらの方法でインストールをしたほうが良いかもしれない。