0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DockerfileでカスタマイズするCloud Workstations

Posted at

前回:CLIで構築するCloud Workstations

Q. ワークステーション構成をカスタマイズするには?

Artifact Registryに保存したコンテナイメージをオプション指定すればOK

gcloud workstations configs create my-config
    --cluster=my-cluster
    --region=asia-northeast1
    --machine-type=e2-standard-4
    --container-custom-image="{IMAGE_NAME}:latest"
    --pd-disk-type=pd-standard
    --pd-disk-size=200
    --enable-ssh-to-vm

そのためのDockerfileを準備し、Artifact Registryにpushしておく

# 1. Artifact Registryに任意のREPOSITORYを作成
$ gcloud artifacts repositories create {REPOSITORY}
    --repository-format=docker
    --location=asia-northeast1
    --async

# 2. 作成リポジトリの完全な名前(IMAGE_NAME)を確認
$ gcloud artifacts repositories describe {REPOSITORY}
    --location=asia-northeast1
    --format='value(name)'

# 3. Dockerfileの場所を指定してビルド
$ docker build .
    -f ./Dockerfile
    -t {IMAGE_NAME}:latest

# 4. ビルドイメージをArtifact Registryに反映
$ docker push {IMAGE_NAME}:latest

Q. Dockerfileにはどんなことが書ける?

まずはCloud Workstationsに対応する公式の事前構築済みイメージをベースとしておくこと。リリースノートイメージ配置場所も参考に

公式イメージは頻繁に更新されるため@sha256:...のようにダイジェスト指定でバージョンを固定しておくと安心

Dockerfile
# CloudWorkstations用Code-OSSのベースイメージ(2025/08/01版。Ubuntu 24.04.2 LTS)を使用
FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss@sha256:380c891fe870f04f420c12a036a1291958d023a655c046939e202b90922cc442

# 動作シェルを設定
SHELL ["/bin/bash", "-c"]

# APTを更新
RUN apt-get update && \
    apt-get upgrade -y

# 以降、カスタマイズ
# ...

以下はカスタマイズ例

■ Gradleを導入したい

URLを指定してインストールする例

Dockerfile
ARG GRADLE_VERSION=8.14
RUN wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip -P /tmp && \
    unzip -d /opt/gradle /tmp/gradle-${GRADLE_VERSION}-bin.zip && \
    rm /tmp/gradle-${GRADLE_VERSION}-bin.zip
ENV GRADLE_HOME=/opt/gradle/gradle-${GRADLE_VERSION}
ENV PATH=${PATH}:${GRADLE_HOME}/bin

■ GitLabの証明書を配置したい

証明書(gitlab-server.crt)をDockerfileと同じディレクトリに配置しておくこと

Dockerfile
RUN apt-get install -y ca-certificates
COPY ./gitlab-server.crt /usr/local/share/ca-certificates/extra/gitlab-server.crt
RUN update-ca-certificates

■ 開発者ユーザにnodecodeコマンドを使用させたい

ベースイメージに含まれるnodeや、Code-OSS本体(/opt/code-oss/bin/codeoss-cloudworkstations)にシンボリックリンクを作成し、パスを通す

Dockerfile
RUN ln -s /opt/code-oss/node /usr/local/bin/node
RUN ln -s /opt/code-oss/bin/codeoss-cloudworkstations /usr/local/bin/code

■ Code-OSSの拡張機能を追加したい

先ほどのcodeコマンドを利用し、Open VSX Registryから任意の拡張機能を追加する。Dockerfileと同じディレクトリにextensions.json参考)を配置すること

Dockerfile
RUN apt-get install -y --no-install-recommends jq
ENV EXT_DIR=/opt/init_data/extensions
RUN mkdir -p "${EXT_DIR}"
ENV INPUT_EXTENSIONS=./extensions.json
RUN jq -r '.recommendations[]' "${INPUT_EXTENSIONS}" | while IFS= read -r EXT || [ -n "$EXT" ]; do \
        CLEAN_EXT=$(echo "$EXT" | tr -d ' ,"\r'); \
        case "$CLEAN_EXT" in \
            ""|\#*) continue ;; \
        esac; \
        echo "Installing extension: $CLEAN_EXT"; \
        code --extensions-dir "$EXT_DIR" --install-extension "$CLEAN_EXT" \
            || echo "!! Failed to install ${CLEAN_EXT}, skipping."; \
    done

ただし、この時点(Dockerfileビルド時)では開発者ユーザ(/home/user)が存在しない。拡張機能はビルド時に適当な場所(今回は/opt/init_data/extensions)にインストールしておき、ワークステーション起動時にユーザのホームディレクトリ(/home/user/.codeoss-cloudworkstations/extensions)にコピーする必要がある

ベースイメージの構造説明によると、ユーザ作成(=/home/user作成)後に実行したい処理は別途エントリーポイントを仕込むことで実現できる

・ワークステーションの起動時に機能を追加するには、/etc/workstation-startup.d/ ディレクトリにスクリプトを追加します。
・起動時に、ベースイメージは /etc/workstation-startup.d/* の下にあるファイルを辞書順に実行し、ワークステーション環境を初期化します。
010_add-user.sh: Cloud Workstations にデフォルトのユーザーを作成します。

つまり、011_init-user.shのような名前のスクリプトを配置しておけばOK

Dockerfile
# ユーザ作成後スプリクトを配置
COPY ./011_init-user.sh /etc/workstation-startup.d/011_init-user.sh
RUN chmod +x /etc/workstation-startup.d/011_init-user.sh
011_init-user.sh
#!/bin/bash

echo "Start [init-user]";

# ログ設定
LOG=/opt/init-user.log
> ${LOG}
exec >> "${LOG}" 2>&1

# Code-OSS拡張機能のコピー、権限設定
INIT_EXTENSIONS=/opt/init_data/extensions
CODE_OSS_EXTENSIONS=/home/user/.codeoss-cloudworkstations/extensions
mkdir -p "${CODE_OSS_EXTENSIONS}"
chown -R user:user /home/user
cp -rv --update=none "${INIT_EXTENSIONS}/." "${CODE_OSS_EXTENSIONS}"
chown -R user:user "${CODE_OSS_EXTENSIONS}"

echo "Finish [init-user]";

このスクリプトはワークステーション起動のたびに実行される。開発者の起動時間を短縮するため、ここに書く処理は最小限にするか、べき等性を保つ工夫をすること

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?