2 min read

docker-compose -f で1階層下のYAMLファイルを指定した時に変数展開出来ない

Table of Contents

トイルの撲滅に向けて運用向けのツールを書き始めていて、せっかくなので Docker を使うことにした。Docker で作った方が配布もしやすいので。

で、僕は基本 Docker 使う時はdocker-composeでやっているのだが、見事?にハマったので、備忘録として残しておく。ただ、一応動く状態にはなったものの、どうにもスッキリしない解決法となってしまった。

結論

ルートに.envのシンボリックを貼った。

いくつか試してみた挙動をみるに、docker-compose upするディレクトリに.envがないと変数展開されないように見える。環境変数そのものはenv_fileで指定したファイルをちゃんと読めているので、そういう挙動ってことで間違いなさそうだ。

ただ、これが「そういうもの」なのか「バグなのか」は深追い出来てないので、時間がある時に内部実装を見てみたい。もしバグなら contribute チャンス!

前提条件

用途としては業務用のツールなのだが、「ツール群」ということで同一リポジトリで管理している関係上、それぞれでディレクトリを掘って運用している。

やりたいこととしては、ルートにいる状態から、1 階層下にあるdocker-compose.yml-fで指定して起動したい。で、マウントするものは各々の環境によるので、.envで指定したい。

1 階層下に行って起動すりゃいいじゃんって話はまぁそうなんだけど、VS Code 使ってる時にボタン 1 ポチした時に発行されるコマンドがdocker-compose -f "tool1/docker-compose.yml" up -d --buildなので、それに合わせたいっていうね。

イメージ出来るように、ディレクトリ構成等を示しておく。

ディレクトリ構成

$ tree ./ -L 2
./
├── tool1
   ├── .env
   ├── Dockerfile
   └── docker-compose.yml
└── tool2
    ├── foo
    └── bar

docker-compose.yml

version: "3"

services:
  hoge_tool:
    build: .
    image: hoge_tool_image
    container_name: hoge_tool_container
    tty: true
    env_file: .env
    working_dir: "/hoge_tools"
    volumes:
      - ./:/hoge_tools
      - ${PIYO}:/piyo

パターン 1

ルートにいる状態でconfigを覗いた場合(※一部伏せ字)。

$ docker-compose -f "tool1/docker-compose.yml" config
WARNING: The PIYO variable is not set. Defaulting to a blank string.
services:
  hoge_tool:
    build:
      context: ***
    container_name: hoge_tool_container
    environment:
      PIYO: /piyo
    image: hoge_tool_image
    tty: true
    volumes:
    - .:/piyo:rw
    working_dir: /hoge_tools
version: '3.0'

環境変数そのものは読めているが、YAML 内の${PIYO}に展開できていない。

パターン 2

docker-compose.ymlのあるディレクトリに行った上で、configを覗いた場合(※一部伏せ字)。

$ cd tool1
$ docker-compose -f "docker-compose.yml" config
services:
  hoge_tool:
    build:
      context: ***
    container_name: hoge_tool_container
    environment:
      PIYO: /piyo
    image: hoge_tool_image
    tty: true
    volumes:
    - /piyo:/piyo:rw
    working_dir: /hoge_tools
version: '3.0'

環境変数も読み出せており、YAML 内の${PIYO}にそれが展開されている。

パターン 3

直下にシンボリックを貼った上で、configを覗いた場合(※一部伏せ字)。

$ ln -s ./tool1/.env
$ docker-compose -f "tool1/docker-compose.yml" config
services:
  hoge_tool:
    build:
      context: ***
    container_name: hoge_tool_container
    environment:
      PIYO: /piyo
    image: hoge_tool_image
    tty: true
    volumes:
    - /piyo:/piyo:rw
    working_dir: /hoge_tools
version: '3.0'

環境変数も読み出せており、YAML 内の${PIYO}にそれが展開されている。

所感

挙動としてかなりモヤる結果になってしまった。

ただこれだと.envの役割ってなんだよって話になってしまうので、なにか指定の方法が間違っていそうな気はするのだが、まだ深追い出来ていないのでなんとも言えないところではある。