


EmacsからDockerコンテナを素早く起動する
しむどん
:
2025-07-09
Dockerコンテナを起動する小さなEmacs Lispを書く。
イメージの一覧は docker image
コマンドを呼び出し、completing-readで選択できるようにする。
(defvar my/docker-image-list-command
"docker image list --format '{{ .Repository }}:{{ .Tag }}'")
(setq my/current-docker-image
(completing-read
"Image: " (string-split
(shell-command-to-string
my/docker-image-list-command))))
Dockerコンテナの起動はカレントディレクトリのみをマウントする。
(defvar my/docker-container-startup-cmd "/bin/bash")
(defvar my/docker-run-command
"docker run --volume '%s:%s' --workdir '%s' -it '%s' '%s'")
(let ((vterm-shell (format my/docker-run-command
default-directory
default-directory
default-directory
my/current-docker-image
my/docker-container-startup-cmd))
(vterm-buffer-name (format "*container %s: %s*" my/current-docker-image default-directory))
(vterm-kill-buffer-on-exit nil))
(vterm))
dotenvファイルを指定する。dotenvファイルは本来複数指定する事が可能だが、筆者はそのような使い方をする事がほとんどない。そのため1つだけしか指定できないようにした。
(let ((dotenv-file
(read-file-name ".env: " nil ".env" nil ".env" t)))
(if (file-exists-p dotenv-file)
(format "--env-file '%s'" dotenv-file)
""))
追加でマウントしたいディレクトリを指定する。追加でマウントしたいディレクトリは複数指定する可能性があるため、 completing-read-multiple
で選択できるようにする。
(defvar my/docker-container-mount-directory-list
'("$HOME/.openhands:/root/.openhands"
))
(completing-read-multiple
"mount: "
my/docker-container-mount-directory-list)
これらを統合する。
しばらくはこれを使っていく。