- App Profile
License | Env | Editor |
|
devbox can build Dev Container without any hesitate.
- on macOS
- OrbStack
- your dotfiles install.sh
on your vimrc for inner container, this setting is essential to pipe clipboard.
" This Repository's Dockerfile using debian OS, my host is macOS(Darwin).
if system('uname -s')->split('\n')[0] =~ 'Linux'
aug Yank
au!
" yankした文字列を共有ファイルに書き込む
au TextYankPost * cal system('tee <&0 > /shared-register/clip', @")
aug END
endif
When you execute command devbox
in devbox.sh, devbox do this flow.
- If not running Docker engine, open OrbStack.
- Read these files (I recommend you to put these on your dotfiles repozitory).
- Dockerfile
- docker-compose.yml
- devbox_gitignore.txt
- If not exist, create directory
.devbox-XXX
and setup files.XXX
is unique number at that time. Here is the sample.
.
├── .devbox-1234/
│ ├── shared-register/ : created when start container
│ │ ├── clip : vim yank register in container
│ │ └── tmp : for watch changeing clip
│ ├── vol/ : bind mount folder to work something
│ ├── docker-compose.yml : from your dotfiles repozitory
│ └── Dockerfile : from your dotfiles repozitory
└── .gitignore : add contents from devbox_gitignore.txt
- Check checksum
Dockerfile
,docker-compose.yml
by md5 and replace from dotfiles repozitory when it has any diff. - Build image. arg
devbox re
will build without cache. - Construct
shared-register
and pipevim yank in container
andhost clipboard
on async process. - Start and login container with
zsh
. - When you logout from container, destruct
shared-register
.
My dotfiles is here.
- Inclue or copy
devbox.sh
in your.zshrc
andexec $SHELL -l
to reload. - Copy tree files on
~/git/dotfiles/conf/devbox
- Dockerfile
- docker-compose.yml
- devbox_gitignore.txt
- Do
devbox
on any directory.
私は日本人なので、こちらの方が饒舌です。
devbox コマンドを用いると、どこでも簡単にコンテナを作成してログインし 気軽に作業して壊せるようになります。 やっていることはただコンテナを起動しているだけですが、いくつか工夫が必要なため レポジトリにまとめました。 VSCodeから来たdev-containerやdev-container-cliの、より汎用版を目指しました。
- M2 MacBookで動作確認済みです
- OrbStack (Dockerが動けば良いのですが、Docker for Desktopよりこちらのが軽いので)
- あなたのdotfilesレポジトリと、そのinstall.shを作っておいてください。
なお、正直たいした行数のshellではないので、ご自分の環境に合わせて適宜修正して使うことは難しくありません。
vimrcに以下を追記することで、コンテナ内のvimでヤンクした値を 共有ファイルに書き込むようにしておき、後述の仕組みから ホストのクリップボードに値を渡せます。
" このレポジトリではDockerfileにdebianのOSイメージを採用しています。
" ホストはmacOSなのでDarwinとなり、同じvimrcでもコンテナで動かしてる時のみ提要できます
if system('uname -s')->split('\n')[0] =~ 'Linux'
aug Yank
au!
" yankした文字列を共有ファイルに書き込む
au TextYankPost * cal system('tee <&0 > /shared-register/clip', @")
aug END
endif
devbox.sh内の関数devbox
を実行すると、以下の流れでコンテナを作成します。
- Dockerエンジンが起動していなければOrbStackを起動します。
- 以下のファイルを参照します。 (本レポジトリにもありますが、あなたのdotfilesに入れると良いと思います。)
- Dockerfile
- docker-compose.yml
- devbox_gitignore.txt
- なければ
.devbox-XXX
というフォルダを作成し、以下のように構成します。XXX
の部分は一意になるような数字です。 未指定でdocker-composeがつけるコンテナ名が{フォルダ名}-{サービス名}なので一意にしています。
.
├── .devbox-1234/
│ ├── shared-register/ : コンテナ起動直前に作成します。
│ │ ├── clip : コンテナ内のvimでヤンクした値を入れ、ホスト側のクリップボードに渡すためのファイル
│ │ └── tmp : clipファイルの変更検知のためのもの
│ ├── vol/ : バインドマウントフォルダ。作業でお好きにお使いいただけます。
│ ├── docker-compose.yml : このymlでコンテナを立ち上げます。
│ └── Dockerfile : この構成のコンテナにします。
└── .gitignore : バインドマウントしているvol以外を無視するよう、既存gitignoreに追記します。
Dockerfile
,docker-compose.yml
のチェックサムをmd5で確認し、差分があればdotfilesの物で更新します。- イメージをビルドします。差分があればコンテナをレイヤのキャッシュを見てビルドします。
devbox re
とreオプションをつけることで、キャッシュを見ずに一からビルドします。 shared-register
フォルダの部分を構築し、コンテナ内のvimでのヤンク
とホストのclipboard
を 非同期プロセスで繋ぎます。このプロセスはコンテナを抜けた際に終了されます。- コンテナを起動し、zshでログインします。
- コンテナをexitすると、
shared-register
やプロセスを消します。
My dotfiles is here.
devbox.sh
の内容をあなたの.zshrc
にsourceするなりコピペするなりして、exec $SHELL -l
なりexec /bin/zsh -l
なりで適用します。- 本レポジトリのうち、以下3つを
~/git/dotfiles/conf/devbox
にコピーしてください。 パスが嫌であれば、devbox関数の中身の変数を変更できます。
- Dockerfile
- docker-compose.yml
- devbox_gitignore.txt
- 任意のフォルダでdevbox関数を実行すれば、そこに.devbox-XXXフォルダを構成して実行されていきます。
なお、Dockerとして当然の話ですが 最初のビルドのみ時間がかかるものの、以降同じDockerfileであれば 何個めでも何回目でも、キャッシュを利用するため即時立ち上がります。
# using debian
# debian使ってます
FROM debian:bullseye-slim
# Enable multi-arch
# マルチアーキ対応させます。x86系(amd64)のバイナリも実行できるようになります。
# https://docs.orbstack.dev/machines/#multi-architecture
RUN dpkg --add-architecture amd64 \
&& apt update \
&& apt upgrade -y \
&& apt install -y libc6:amd64
# install some.
# お好きな物いれてください
RUN apt install -y \
wget sudo time \
curl zsh git \
build-essential ca-certificates \
gzip file exiftool
# vim 9をビルドします。debianでapt install vimは8.xしかなかったです
# for vim9
# https://uhoho.hatenablog.jp/entry/2023/05/09/033455
RUN apt install -y build-essential autoconf automake cproto \
gettext libtinfo-dev libacl1-dev libgpm-dev \
libxmu-dev libgtk-3-dev libxpm-dev \
libperl-dev python3-dev ruby-dev \
libncurses-dev \
lua5.4 liblua5.4-dev \
libsodium-dev libcanberra-dev tcl-dev \
&& git clone --depth 1 https://github.com/vim/vim.git \
&& cd vim/src \
&& ./configure --prefix=/root/.local --enable-multibyte --enable-cscope --enable-perlinterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-fontset --enable-xim --enable-terminal --enable-fail-if-missing --with-x --enable-gui=gtk3 --enable-tclinterp \
&& make && make install \
&& ln -nfs /root/.local/bin/vim /usr/bin/vim
# for shared-register (clipboard)
# vimヤンクとホストのクリップボードを非同期で繋ずるために必要です
RUN mkdir /shared-register
# dotfiles
# あなたのdotfilesを入れるinstall.shをcurlで呼び出します。
# apt install kind.
# debianなのでapt install系で作ってください。
RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/serna37/dotfiles/master/install.sh)"
services:
sandbox:
build: .
volumes:
# for shared-register
# クリップボード共有のため
- type: bind
source: ./shared-register
target: /shared-register
# for work
# 好きな作業用に。コンテナからここに入れたものが成果物みたいなイメージ
- type: bind
source: ./vol
target: /work
# to keep running container
# コンテナを起動させ続ける
# https://qiita.com/messhii222/items/01ae86ebedd576355fab
tty: true
stdin_open: true