トイルの撲滅に向けて運用向けのツールを書き始めていて、せっかくなので 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
の役割ってなんだよって話になってしまうので、なにか指定の方法が間違っていそうな気はするのだが、まだ深追い出来ていないのでなんとも言えないところではある。