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:...のようにダイジェスト指定でバージョンを固定しておくと安心
# 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を指定してインストールする例
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と同じディレクトリに配置しておくこと
RUN apt-get install -y ca-certificates
COPY ./gitlab-server.crt /usr/local/share/ca-certificates/extra/gitlab-server.crt
RUN update-ca-certificates
■ 開発者ユーザにnode、codeコマンドを使用させたい
ベースイメージに含まれるnodeや、Code-OSS本体(/opt/code-oss/bin/codeoss-cloudworkstations)にシンボリックリンクを作成し、パスを通す
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(参考)を配置すること
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
# ユーザ作成後スプリクトを配置
COPY ./011_init-user.sh /etc/workstation-startup.d/011_init-user.sh
RUN chmod +x /etc/workstation-startup.d/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]";
このスクリプトはワークステーション起動のたびに実行される。開発者の起動時間を短縮するため、ここに書く処理は最小限にするか、べき等性を保つ工夫をすること