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)

これらを統合する。

しばらくはこれを使っていく。