Docker Composeの使い方

mdbook-ja-templateではコマンド実行のためにDocker Composeを使用しています。 mdbook-ja-templateのdocker-compose.ymlの内容は以下のとおりです。

version: '3.9'

x-service:
  &default-service
  build: docker
  image: mdbook
  init: true
  volumes: [".:/book:rw"]
  network_mode: "host"
  user: "${UID}:${GID}"

services:
  mdbook:
    <<: *default-service
    entrypoint: ["mdbook"]
    command: ["serve"]

  mdbook-mermaid:
    <<: *default-service
    entrypoint: ["mdbook-mermaid"]

  mdbook-linkcheck:
    <<: *default-service
    entrypoint: ["mdbook-linkcheck"]

  markdownlint:
    <<: *default-service
    entrypoint: ["markdownlint"]

  textlint:
    <<: *default-service
    entrypoint: ["textlint"]

  exec:
    <<: *default-service
    entrypoint: []

コンテナ内のコマンドを直接実行する

コンテナ内のコマンドを直接実行する場合は、Docker Composeを使用してください。

UID, GIDの設定

Docker Composeの起動時は現在操作しているユーザのユーザIDとグループIDを環境変数として与える必要があります。 コンテナ内のプロセスが生成するファイルの所有者をrootではなく、現在のユーザにするためです。

コンテナ内でmdbook helpコマンドを実行する場合は、以下のようにDocker Composeを実行してください。 UID, GIDは環境変数ではなくシェルの変数であるため、Docker Composeプロセスへと通知するために環境変数として明に設定する必要があります。

env UID=${UID} GID=${GID} docker compose run --rm mdbook help

.envファイルを用意することで、コマンドラインでUID/GIDを設定することを省略できます。 以下コマンドを実行することで.envファイルが生成されます。 すでに.envファイルが存在する場合、内容は上書きされてしまうので注意してください。

make setup-docker-compose
# => .envが生成される
docker compose run --rm mdbook help
# => UID, GIDの設定は暗黙的に行われる

コマンドの実行

以下の形式でコマンドを実行できます。

docker compose run --rm <コマンド名> <引数>

コマンド名には以下を指定できます。

  • mdbook: mdbookコマンドを実行する
  • mdbook-mermaid: mdbook-mermaidコマンドを実行する
  • mdbook-linkcheck: mdbook-linkcheckコマンドを実行する
  • markdownlint: markdownlintコマンドを実行する
  • textlint: textlintコマンドを実行する
  • exec: 引数で指定されたコマンドを実行する

コンテナ内でbashの会話型セッションを開始する場合のコマンド例を以下に示します。

docker compose run --rm exec bash