Slide 1

Slide 1 text

最強の Dev Container を考える Atsushi Morimoto @74th

Slide 2

Slide 2 text

Atsushi Morimoto (@74th) 株式会社Mobility Technologies AI技術開発部プロダクトグループ AI技術をタクシー事業者向けのプロダクトにして 最後ドライバーさんに提供するデータの表現や データのインフラに責任を持つサーバサイドエンジニア

Slide 3

Slide 3 text

VS Code関連の活動 https://techbookfest.org/organization/6283189395914752 VS Codeの機能や3つの言語での実践的な開発方法を解説した 「Visual Studio Code実践ガイド」や 技術書典で VS Code関連同人誌を作っています。

Slide 4

Slide 4 text

VS Code関連の活動 - Visual Studio Code Debug Specs 様々な言語・環境のVS Codeでのデバッグ手法を集めたリポジトリ - Vim Style(メンテ終了) 世界最速リリースのVimキーバインド拡張機能 - Editing Snippets with YAML YAMLでスニペットを編集する拡張機能 - Monokai Charcoral High Contrast Theme - High Contrast Icons

Slide 5

Slide 5 text

AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage Buildを使ったDev Containerを極める 4. Dev Containerの将来

Slide 6

Slide 6 text

詳しい内容は…… https://techbookfest.org/product/ 4696850535809024

Slide 7

Slide 7 text

AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage Buildを使ったDev Containerを極める 4. Dev Containerの将来

Slide 8

Slide 8 text

一般的な開発環境 一つのマシンに全てのツールをインストールして使うのが、 一般的な開発環境です

Slide 9

Slide 9 text

Remote Development (SSH) Computing Resourceの外部化 VS CodeのRemote Development機能によって クラウドなどの外部に開発環境を持つことができます 開発環境のComputing Resourceの外部化と言えます

Slide 10

Slide 10 text

Dev Container Remote Container機能では 同一マシン内の Dockerに開発環境を構築できます

Slide 11

Slide 11 text

Github Codespaces Github Codespacesは クラウドのDockerコンテナサービスということができ、 Dockerコンテナ化した開発環境を オンデマンドに得ることができます

Slide 12

Slide 12 text

Dev Containerの功績 環境構築手順のコード化を強制する(Dockerfile) ● 環境構築にコード化されていない手順がないことを証明している ● 本番環境と同一であることを証明できる 環境を運搬可能にする(Dockerコンテナ)

Slide 13

Slide 13 text

.devcontainer/devcontainer.jsonの功績 開発環境のコンテナ化を"定義"した ● コンテナ定義 Dockerfile / docker-compose.yaml / image ● ユーザ名 vscode ● ワークスペースマウント /workspace ● コンテナ起動後コマンド postCommand ローカル環境に依存する要素(ワークスペース、UID)をまとめた

Slide 14

Slide 14 text

AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage Buildを使ったDev Containerを極める 4. Dev Containerの将来

Slide 15

Slide 15 text

実行時に使うもの アプリケーション実行時にはそのアプリケーションだけで動作することは少なく、 依存するライブラリや、そのアプリケーションのランタイムが必要になります

Slide 16

Slide 16 text

今までDockerコンテナが担ってきたこと 今までのDockerコンテナは、 ランタイムと依存するライブラリを収めることだけを責務に持つことが多かったと思います

Slide 17

Slide 17 text

開発時に使うもの 一方開発環境には、ライブラリとランタイム以外にも LinterやTest Runnerなどが必要になります

Slide 18

Slide 18 text

リモートコンテナでDev Containerの中にあるもの では開発時にコンテナには何を収めるべきか考えると これら全てをコンテナの中で実行する必要があります

Slide 19

Slide 19 text

Dev Containerを作るときに必要なもの Application CodeやTest Codeはリポジトリから与えられるため 実際にDev Containerの中に収めるべきものはこれだけになります なかなか大変ですが、これらが Dev Containerに収めるべきものと考えられます

Slide 20

Slide 20 text

雑に考える 複雑そうなDev Containerについて考えましたが、 一旦それらを捨てて簡単な Dev Contaienrの責務を考えます

Slide 21

Slide 21 text

PackageManagerを後から実行する 昨今は言語に応じた様々な Package Managerがあり 多くのライブラリや開発時に使うプログラムは Package Managerに定義であるManifestを与えることで インストールできます ManifestはApplication Codeの一部であることが多いです つまり、Package ManagerさえあればDev Containerの機能を満 たすとも言えます

Slide 22

Slide 22 text

AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage Buildを使ったDev Containerを極める 4. Dev Containerの将来 ここからは先程考えた Dev Containerの責務をよりよく満たすために、 Multi Stage Buildを使ったDev Containerの構築方法を紹介します

Slide 23

Slide 23 text

Multi Stage Build FROM golang:1.13 AS build-env WORKDIR /work RUN ... FROM build-env AS production RUN ... CMD [...] Multi Stage BuildはDockerコンテナのbuildを段階に分けることができる機能です build-envというコンテナから productionコンテナを作る例です

Slide 24

Slide 24 text

成し遂げたいこと ● Production Container、もしくはコンパイル時に、 Dev Containerで同じライブラリを使う ● Production Containerには開発ツールを入れないこと よりよいDev Containerにするために このようなことを成し遂げたいと考えます

Slide 25

Slide 25 text

Go Goのビルドについてまず解説します Goのビルドでは、go.mod、go.sumという依存ライブラリの定義 manifestファイルがあります これを使うと依存するライブラリの指定したバージョンをインストールできます コードとこのライブラリを用いて、 Application Binaryをビルドします

Slide 26

Slide 26 text

Goの Multi Stage Build Goで一般的に行われる Multi Stage Buildの場合 Goのコンパイラの入ったコンテナでビルドを行い、 Application Binaryだけを別のコンテナにコピーすることが よく行われます

Slide 27

Slide 27 text

Build Containerと同じライブラリを持つために、 依存ライブラリだけを収めた baseコンテナを作ります このコンテナから、 Dev Containerとbuild Containerを 作ることで要件を満たすことができます

Slide 28

Slide 28 text

Dockerfile ● 動作するものを公開中 https://github.com/74th/devcontainer-book-go/blob/master/Dockerfile ● VS Code公式が公開するDebian用スクリプトを実行して Dev Container環境を作る https://github.com/microsoft/vscode-dev-containers/blob/master/script-library/common-debian.sh ● Go用のDev Container構築スクリプトもある、こちらも実行する https://github.com/microsoft/vscode-dev-containers/blob/master/script-library/go-debian.sh ● 最近、ビルド及びリント(CI)用コンテナは Dev Containerのイメージで良い気がしてきている 今回のDockerfileはgithubで公開しています また、Dev Containerを作るにはMicrosoftの公開するスクリプトを使うと、 さっとDev Contanerのための環境を作ることができます Goの開発ツール郡をインストールをするスクリプトもあります。 そして、私は最近 CI環境のコンテナは Dev Containerを流用するのが良いように思えてきました

Slide 29

Slide 29 text

PythonでPoetryを使ったDev Cotainerを考えると このようになるでしょう

Slide 30

Slide 30 text

AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage Buildを使ったDev Containerを極める 4. Dev Containerの将来

Slide 31

Slide 31 text

Dev Containerの将来 MS公式見解などではなく、@74th の頭の中の考えです ● リモートコンテナ機能は VS Code のオープンソースではない VS Codeに閉じた機能である ● Dev Containerの発想(開発環境コンテナ)自体は VS Codeに閉じた発想ではない ● Dev Containerで実現するプログラミング支援の機能自体は LSP によってVS Codeに閉じたことではない ● LSP と結びつくことで、Dev Containerの概念が一般化するのではないか ● Build/CI環境 = Dev Container が一般化するのでは ● CI環境で動かす LSP という概念が一般化するのでは

Slide 32

Slide 32 text

Conclusion ● devcontainer.jsonで開発環境のコンテナ化を"定義"したと解説しました ● Dev Containerの中にあるべきものを解説しました ● Multi Stage Buildを使った実践例を解説しました ● Dev Containerの将来をちょっと考えてみました 我こそは最強のDev Containerを作った!という方はぜひ紹介ください!