実行環境
実行環境は、開発環境インスタンスに使用される Docker イメージ、インスタンス型、およびインスタンスに提供される環境変数のセットのパラメーターによって定義されます。
デフォルトの Docker イメージ
Docker イメージを指定しない場合、Space はデフォルトのイメージを使用します。デフォルトのイメージは Ubuntu OS に基づいており、Git、curl、Docker、Docker Compose、Kubernetes、Google Cloud サポート、Open JDK、Python、PHP、.NET SDK、Ruby、Go、Node.js、npm、yarn、その他のツールが含まれています。
デフォルトのイメージ Dockerfile
:
FROM ubuntu:20.04
ENV LANG=C.UTF-8
MAINTAINER Alexander Sedov <alexander.sedov@jetbrains.com>
ARG TARGETARCH
# Support various rvm, nvm etc stuff which requires executing profile scripts (-l)
SHELL ["/bin/bash", "-lc"]
CMD ["/bin/bash", "-l"]
# Set debconf to run non-interactively
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
RUN apt-get update && apt-get install -y apt-utils apt-transport-https software-properties-common
# Newest git
RUN apt-add-repository ppa:git-core/ppa -y && apt-get update
RUN set -ex -o pipefail && apt-get install -y \
# Useful utilities \
curl unzip wget socat man-db rsync moreutils vim lsof \
# VCS \
git subversion subversion-tools mercurial \
# Database clients \
mongodb-clients mysql-client postgresql-client jq redis-tools \
# C/C++ \
build-essential cmake g++ m4 \
# R \
r-base r-base-dev \
# TeX \
texlive \
# JVM \
openjdk-8-jre-headless openjdk-11-jdk-headless openjdk-17-jdk-headless maven ant clojure scala \
# Python 3 \
python3-matplotlib python3-numpy python3-pip python3-scipy python3-pandas python3-dev pipenv \
# Python 2 \
python2-dev python-pip-whl \
# Ruby \
ruby-full \
&& \
# Setup Java \
update-alternatives --get-selections | grep usr/lib/jvm | awk '{print $1}' | \
grep -v jpackage | grep -v jexec | \
while IFS= read line; do echo $line; update-alternatives --set $line /usr/lib/jvm/java-11-openjdk-$TARGETARCH/bin/$line; done && \
java -version && javac -version && \
# Check Python \
python3 --version && python2 --version && pip3 --version && \
# Go \
curl -fsSL "https://dl.google.com/go/$(curl -fsSL 'https://golang.org/VERSION?m=text').linux-$TARGETARCH.tar.gz" -o /tmp/go.tar.gz && \
tar -C /usr/local -xzf /tmp/go.tar.gz && rm /tmp/go.tar.gz && \
for x in /usr/local/go/bin/*; do echo $x; ln -vs $x /usr/local/bin/$(basename $x); done && ls -la /usr/local/bin && go version
## Nodejs, npm, yarn
RUN set -ex -o pipefail && \
curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null && \
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y nodejs yarn
## PHP
RUN set -ex -o pipefail && \
add-apt-repository ppa:ondrej/php -y && \
apt-get install -y --no-install-recommends php8.0-cli php8.0-common php8.0-curl php8.0-xml php8.0-mbstring && \
wget https://github.com/composer/composer/releases/download/2.2.1/composer.phar -O /usr/bin/composer -q && \
chmod +x /usr/bin/composer
## dotNet
RUN if [ "$TARGETARCH" == "arm64" ] ; \
then echo "Skipping installation of .NET packages, as they are only available for arm64 starting from Ubuntu 22.04" ; \
else set -ex -o pipefail && \
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && \
dpkg -i packages-microsoft-prod.deb && \
rm packages-microsoft-prod.deb && \
apt-get update && \
apt-get install -y dotnet-sdk-6.0 ; \
fi
### Cloud Tools
## The awscli tools use a different naming scheme for arm64 builds
RUN if [ "$TARGETARCH" == "arm64" ] ; \
then AWS_TOOLS_ARCH=aarch64 ; \
else AWS_TOOLS_ARCH=x86_64 ; \
fi && \
set -ex -o pipefail && \
# Docker \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list && \
apt-get install -y docker.io && \
docker --version && \
# Kubernetes \
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg && \
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list && \
apt-get update && apt-get install -y kubectl && \
kubectl version --client && \
# aws-cli \
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-$AWS_TOOLS_ARCH.zip" -o /tmp/awscliv2.zip && \
mkdir -p /tmp/aws.extracted && \
unzip -q /tmp/awscliv2.zip -d /tmp/aws.extracted && \
/tmp/aws.extracted/aws/install && \
rm -rf /tmp/aws.extracted /tmp/awscliv2.zip && \
/usr/local/bin/aws --version && \
# gcloud \
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee /etc/apt/sources.list.d/google-cloud-sdk.list && \
apt-get update && apt-get install -y google-cloud-sdk && \
gcloud --version && \
# rclone \
curl -fsSL https://downloads.rclone.org/v1.56.2/rclone-v1.56.2-linux-$TARGETARCH.zip -o /tmp/rclone.zip && \
mkdir -p /tmp/rclone.extracted && unzip -q /tmp/rclone.zip -d /tmp/rclone.extraced && \
install -g root -o root -m 0755 -v /tmp/rclone.extraced/*/rclone /usr/local/bin && \
rm -rf /tmp/rclone.extraced /tmp/rclone.zip && \
rclone --version
## Docker compose (https://docs.docker.com/compose/install/)
## There are no arm64 builds of docker-compose for version 1.x.x, so version 2.x.x is used
RUN if [ "$TARGETARCH" == "arm64" ] ; \
then DOCKER_COMPOSE_VERSION=v2.14.0 ; \
else DOCKER_COMPOSE_VERSION=1.29.2 ; \
fi && \
set -ex -o pipefail && \
curl -fsSL "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose && \
rm -f /usr/bin/docker-compose && \
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
RUN echo "############################### Versions #####################################" && \
java -version && \
javac -version && \
echo "" && \
python3 --version && \
python2 --version && \
pip3 --version && \
echo "" && \
go version && \
echo "" && \
echo ".NET SDK" && \
if [ "$TARGETARCH" != "arm64" ] ; then dotnet --list-sdks ; else echo "Not available for arm64" ; fi && \
echo "" && \
echo ".NET Runtimes" && \
if [ "$TARGETARCH" != "arm64" ] ; then dotnet --list-runtimes ; else echo "Not available for arm64" ; fi && \
echo "" && \
echo "Nodejs: $(node --version)" && \
echo "Npm: $(npm --version)" && \
echo "Yarn: $(yarn --version)" && \
echo "" && \
ruby --version && \
echo "" && \
php -v && \
composer -V && \
echo "" && \
docker --version && \
docker-compose --version && \
echo "" && \
echo "Kubectl: $(kubectl version --client)" && \
echo "" && \
gcloud --version && \
echo "" && \
rclone --version && \
echo "############################### Versions #####################################"
この Dockerfile をベースとして使用して、独自のイメージを作成し、Space パッケージでホストできます。詳細
開発環境のイメージを指定する
開発環境は Docker コンテナーで実行されます。devfile.yaml
でイメージを指定しない場合、Space はデフォルトのイメージを使用します。カスタムイメージとして、Docker Hub (または認証を必要としないその他のレジストリ)、Space パッケージからのイメージを使用したり、ユーザーが新しい開発環境を作成するたびに Dockerfile
からイメージを作成したりできます。イメージを指定するには、プロジェクトの devfile を使用します。
- イメージの要件
OS : any glibc-based Linux distribution (for example, CentOS 7+, Debian 9+, Ubuntu 20.04+).
ツール : Git、OpenSSH (リモート Git リポジトリを使用する場合)、lsof (IDE でポート転送が必要な場合)。
コンテナーは root
として実行する必要があります ( Dockerfile
には非 root ユーザーが存在してはなりません)。
- コンテナーイメージとウォームアップスナップショットの比較
場合によっては、特定の準備ステップをコンテナーイメージに配置するか、環境ウォームアップに配置するか、というジレンマに直面することがあります。例: プロジェクトには SDK が必要です。SDK を入手するには、curl - o sdk.zip $SDK_URL && unzip sdk.zip
を実行します。この行を Dockerfile
またはウォームアップスクリプトのどこに記述しますか ?
推奨事項:
すべての追加ツール (例: apt get
でインストールされるツール) は、開発環境のイメージ (つまり、Dockerfile
で説明されている) にインストールする必要があります。
root
またはプロジェクトディレクトリ内に保存されているすべてのバイナリ依存関係は、ウォームアップスクリプトに移動する必要があります。上記の例では、ウォームアップスクリプトで SDK を取得するのが最善の解決策となります。
components.container.image
パラメーターには、完全なイメージ URL を指定します。
重要: Space Packages レジストリは、開発環境を構成する同じプロジェクトに属しているか、このプロジェクトにアタッチされている必要があります。
schemaVersion: 2.2.0
attributes:
space:
instanceType: regular
editor:
type: Idea
components:
- name: ubuntu-container
container:
image: mycompany.registry.jetbrains.space/p/myprj/container/dev-image:latest
開発環境では、コンテナーイメージにカスタム Dockerfile
を使用できます。Dockerfile
はプロジェクトリポジトリ内のどこにでも配置できます。この場合、ユーザーが新しい開発環境を作成するたびに、Space がイメージを構築することに注意してください。開発環境の起動時間を短縮するには、イメージを一度ビルドして、プロジェクトの Space Packages レジストリに公開することをお勧めします。
プロジェクトのソースコードを開き、たとえば docker
ディレクトリに Dockerfile
を作成します。
Dockerfile
を編集してイメージを構成します。
例: Java プロジェクトのイメージ:
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV LC_ALL=C.UTF-8
RUN apt-get update
RUN apt-get install -y \
git \
openjdk-11-jdk \
&& rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
プロジェクトのソースコードを開き、プロジェクトの devfile を開きます。存在しない場合は、新しいもの ( .space/devfile.yaml
など) を作成します。
devfile で、Dockerfile (uri
) へのパスを指定し、オプションで Docker コンテキスト (buildContext
) へのパスを指定します。両方のパスを projectRoot
を基準にして指定する必要があります。例:
schemaVersion: 2.2.0
attributes:
space:
instanceType: large
editor:
type: Idea
components:
- name: image-build
image:
# (Required)
imageName: my-image:latest
dockerfile:
# (Optional) path to Docker context relative to projectRoot
# by default, projectRoot is repository root
buildContext: docker
# (Required) path to Dockerfile relative to projectRoot
uri: docker/Dockerfile
args:
- 'ARG1=A'
- 'ARG2=B'
変更をコミットしてプッシュします。
Docker Hub だけでなく、認証を必要としないパブリックレジストリのイメージも使用できます。Docker Hub のイメージの場合はイメージ名のみ指定できます。他のレジストリの場合は、完全なイメージ URL を指定する必要があります。
schemaVersion: 2.2.0
attributes:
space:
instanceType: regular
editor:
type: Idea
components:
- name: openjdk-container
container:
# image from Docker Hub
image: openjdk:latest
デフォルトの開発環境インスタンスタイプを指定する
開発環境は、通常 (4 vCPU、8 GB)、大規模 (8 vCPU、16 GB)、特大 (16 vCPU、32 GB) の 3 つの異なる仮想マシンインスタンスで実行できます。開発環境の請求について詳しく見る
デフォルトのインスタンス型を指定するには、space.instanceType
パラメーターを使用します。ユーザーは、開発環境を作成するときに別のインスタンス型を選択できます。
schemaVersion: 2.2.0
attributes:
space:
# regular, large, xlarge
instanceType: large
editor:
type: Idea
環境変数を設定する
開発環境コンテナーで環境変数を定義するには、components.container.env
パラメーターを使用します。
schemaVersion: 2.2.0
attributes:
space:
instanceType: large
editor:
type: Idea
components:
- name: dev-container
container:
env:
- name: VAR_A
value: 'valueA'
- name: VAR_B
value: 'valueB'
新しい環境を作成するときに、環境変数に追加された変数を表示できます。

更新された devfile をプロジェクトリポジトリにプッシュすると、指定された環境変数は新しく作成された開発環境でのみ使用できるようになります。