VSCode DevContainerでSysML v2の開発環境を構築する🛠️
はじめに
システムズエンジニアリングの分野で注目を集めているSysML v2。この記事では、VSCode DevContainerを使用してSysML v2の開発環境を構築する方法を紹介します。
この記事の内容は、gorenje氏のSysMLv2 Jupyter Docker環境を参考にしています。gorenje氏の素晴らしい環境構築に感謝すると共に、VSCodeのDevContainer環境に適応させるためにいくつかの修正を加えています。
また、この記事で紹介する環境構築のためのコードは、私のGitHubリポジトリで公開しています。実際の設定ファイルやDockerfileをご覧いただけますので、ぜひチェックしてみてください。
前提条件
- Visual Studio Codeがインストールされていること
- Dockerがインストールされていること
- VSCodeのRemote - Containers拡張機能がインストールされていること
環境構築手順
1. プロジェクトの作成
まず、新しいディレクトリを作成し、VSCodeで開きます。
mkdir sysmlv2-devcontainer
cd sysmlv2-devcontainer
code .
2. DevContainer設定ファイルの作成
.devcontainer
ディレクトリを作成し、必要なファイルを追加します。
mkdir .devcontainer
cd .devcontainer
devcontainer.json
ファイルを作成し、以下の内容を追加します:
{
"name": "SysML Development Environment",
"dockerComposeFile": "docker-compose.yml",
"service": "sysmljupyter",
"workspaceFolder": "/workspace",
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "/home/sysml/conda/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": false,
"python.linting.mypyEnabled": false,
"python.linting.ruffEnabled": true,
"python.formatting.provider": "none",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit"
}
},
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter",
"charliermarsh.ruff"
]
}
},
"postCreateCommand": "pip install ruff"
}
docker-compose.yml
ファイルを作成し、以下の内容を追加します:
version: '3'
services:
postgresdbserver:
image: postgres:9.6.6
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=mysecretpassword
- POSTGRES_DB=sysml2
volumes:
- postgresdbserver:/var/lib/postgresql/data
sysmlapiserver:
build:
context: ..
dockerfile: .devcontainer/Dockerfile.api
tty: true
depends_on:
- postgresdbserver
sysmljupyter:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
volumes:
- ..:/workspace:cached
command: /bin/sh -c "while sleep 1000; do :; done"
depends_on:
- sysmlapiserver
volumes:
postgresdbserver:
Dockerfile
を作成し、以下の内容を追加します:
FROM openjdk:17-slim
RUN apt-get update && apt-get install -y \
gcc \
g++ \
wget \
inkscape \
texlive-fonts-recommended \
texlive-base \
texlive-xetex \
jq
ARG NB_USER=sysml
ARG NB_UID=1000
ENV USER ${NB_USER}
ENV NB_UID ${NB_UID}
ENV HOME /home/${NB_USER}
RUN adduser --disabled-password \
--gecos "Default user" \
--uid ${NB_UID} \
${NB_USER}
USER ${NB_USER}
WORKDIR ${HOME}
RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
RUN chmod 755 ${HOME}/Miniconda3-latest-Linux-x86_64.sh
RUN mkdir ${HOME}/conda
RUN ${HOME}/Miniconda3-latest-Linux-x86_64.sh -f -b -p ${HOME}/conda
RUN ${HOME}/conda/condabin/conda init
RUN ${HOME}/conda/condabin/conda update conda
RUN ${HOME}/conda/condabin/conda install -n base conda-build conda-libmamba-solver
RUN ${HOME}/conda/condabin/conda config --set solver libmamba
ENV PATH="${HOME}/conda/bin:${HOME}/conda/condabin:${PATH}"
RUN pip install jupyterlab ruff
Dockerfile.api
を作成し、以下の内容を追加します:
FROM openjdk:11-slim
RUN apt-get update && apt-get install -y \
wget \
xmlstarlet
ARG NB_USER=sysml
ARG NB_UID=1000
ENV USER ${NB_USER}
ENV NB_UID ${NB_UID}
ENV HOME /home/${NB_USER}
RUN adduser --disabled-password \
--gecos "Default user" \
--uid ${NB_UID} \
${NB_USER}
USER ${NB_USER}
WORKDIR ${HOME}
ARG SBT_VERSION=1.2.8
RUN wget -q https://github.com/sbt/sbt/releases/download/v${SBT_VERSION}/sbt-${SBT_VERSION}.tgz
RUN tar xfz sbt-${SBT_VERSION}.tgz
ARG RELEASE=2023-02
RUN wget -q https://github.com/Systems-Modeling/SysML-v2-API-Services/archive/${RELEASE}.tar.gz -O ${RELEASE}.tar.gz
RUN tar xfz ${RELEASE}.tar.gz
WORKDIR ${HOME}/SysML-v2-API-Services-${RELEASE}
RUN ${HOME}/sbt/bin/sbt clean update compile
RUN sed -i 's/key=.whatever./key="longersecretnowarnings"/' conf/application.conf
ARG SYSML_API_SERVER="sysmlapiserver:9000"
RUN echo "\n\nplay.filters.hosts {\n allowed = [\"${SYSML_API_SERVER}\", \"localhost:9000\"]\n}\n" >> conf/application.conf
ARG DB_SERVER_URL="jdbc:postgresql://postgresdbserver:5432/sysml2"
ARG DB_USER="postgres"
ARG DB_PASSWORD="mysecretpassword"
RUN xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="javax.persistence.jdbc.url"]/@value' -v ${DB_SERVER_URL} conf/META-INF/persistence.xml \
&& xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="javax.persistence.jdbc.user"]/@value' -v ${DB_USER} conf/META-INF/persistence.xml \
&& xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="javax.persistence.jdbc.password"]/@value' -v ${DB_PASSWORD} conf/META-INF/persistence.xml \
&& xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="hibernate.hbm2ddl.auto"]/@value' -v "update" conf/META-INF/persistence.xml
EXPOSE 9000
CMD ${HOME}/sbt/bin/sbt run
3. DevContainerの起動
VSCodeのコマンドパレット(Ctrl+Shift+P)を開き、"Remote-Containers: Reopen in Container"を選択します。
初回は時間がかかりますが、DockerイメージのビルドとコンテナーC起動が完了するとVSCodeが自動的にコンテナー内の環境に接続されます。
環境の使用方法
Jupyter Notebookの起動
.ipynb
を開くとnotebook環境なります. 右上の「カーネルを選択」でPython環境を選択すれば実行可能です。
SysML API Serverへのアクセス
SysML API Serverはhttp://localhost:9000
でアクセスできます。
データベース接続情報
PostgreSQLデータベースには以下の情報で接続できます:
- ホスト:
postgresdbserver
- ポート:
5432
- ユーザー名:
postgres
- パスワード:
mysecretpassword
- データベース名:
sysml2
おわりに
この記事では、VSCode DevContainerを使用してSysML v2の開発環境を構築する方法を紹介しました。この方法を使うことで、チーム全体で一貫した環境を簡単に共有でき、「環境構築」という面倒な作業から解放されます。Vscode上で完結するのは地味にうれしいですね。
ここで紹介した設定は、gorenje氏のSysMLv2 Jupyter Docker環境をベースにしています。SysML v2の開発環境に興味がある方は、オリジナルのリポジトリも確認することをおすすめします。
また、この記事で紹介した環境構築のための具体的なコードは、私のGitHubリポジトリで公開しています。実際の実装を見たい方や、自分の環境ですぐに試してみたい方は、このリポジトリをクローンして使ってみてください。
SysML v2は日々進化しているため、必要に応じてDockerfileやdevcontainer.jsonの内容を最新のものに更新してください。また、gorenje氏のリポジトリも定期的にチェックし、新しい改善点があればそれを取り入れることも検討してみてください。
皆さんのSysML v2を使ったシステムモデリングが捗ることを願っています!
参考リンク
- chantakan/dev-container_for_SysML - この記事で紹介している環境のリポジトリ
- gorenje/sysmlv2-jupyter-docker - 参考にしたオリジナルのDocker環境
- SysML v2 API Services
- Visual Studio Code Remote - Containers
Discussion