現象
(前略)
nginx:
image: nginx:1.15.8-alpine
ports:
- 80:81
volumes:
- ./build_containers/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./build_containers/nginx/conf.d:/etc/nginx/conf.d
(後略)
こんなdocker-compose.ymlを書いてdocker-compose upしようとしたら以下のエラーで怒られました。
ERROR: for nginx Cannot start service nginx: b'OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/Users/hanako/workspace/hhvm_docker/build_containers/nginx/nginx.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/c83b3706f458289bc3a092d82f657157cea6ef040c089cbe650c5ec40d95930c/merged\\\" at \\\"/var/lib/docker/overlay2/c83b3706f458289bc3a092d82f657157cea6ef040c089cbe650c5ec40d95930c/merged/etc/nginx/nginx.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type'
改行がなくて読みにくいけど……どうやらvolumesで指定しているホスト側のマウントパスが悪いっぽい?
解決法
結論:ホスト側にマウント元を作ってあげないとだめだった。
ちょっと考えたら当たり前のことだったのですが、このvolumesって、「ホストマシンにあるファイルを→dockerコンテナにマウントする」という指定なんですよね。
ただ、docker-composeで指定しているマウント先がホスト側になかった場合、docker-composeが勝手にホスト側にディレクトリを作ってくれるみたいです。
なので、今回はホストに作られたnginx.confというディレクトリをコンテナ内のnginx.confにマウントしようとして、「ディレクトリをファイルにマウントしようとしていないかい?」と怒られていたのでした。
nginx.confを作成してホストマシンのマウント元(この場合は)に格納すれば解決!
今回の場合はこんなイメージですね!
ルートディレクトリ/
∟docker-compose.yml
∟build_countainers/
∟nginx/
∟nginx.conf
∟nginx.d/
ちなみにnginx.confのファイル自体は作成しても、中身は作り込まないままで起動すると大変なことになるので、ある程度作り込むまでは無理にvolumesの設定をしないほうがいいと思います!