ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録

docker-composeのvolumesでホストパスを使うときはホストOSに注意

問題

  • ローカルのmacでdocker-composeした結果と、CodeBuildでdocker-composeした結果が異なってなんでだろうってなった
    • CodeBuildの方でそんなファイルねーよってエラーが出てた

原因

  • docker-compose の volumes はホストOSのファイルシステムを利用してファイルへアクセスする
  • macは大文字・小文字を区別しないが、CodeBuild(Ubuntu)は区別する
    • ファイル名指定で大文字小文字が誤っており、CodeBuildの方ではファイルが存在しないと言われる

テストしてみた

準備

ローカルに Test.txt というファイルを配置。volumesでコンテナに見せる。

docker-compose.yml

version: '3'
services:
  app:
    image: alpine:latest
    tty: true
    volumes:
      - ".:/app"

起動

# docker-compose up -d

macで実行してみた結果

≻ uname -a
Darwin hogehoge.local 17.7.0 Darwin Kernel Version 17.7.0: Thu Dec 20 21:47:19 PST 2018; root:xnu-4570.71.22~1/RELEASE_X86_64 x86_64
≻ docker-compose exec app /bin/sh -c "cat /app/Test.txt"
test
≻ docker-compose exec app /bin/sh -c "cat /app/test.txt"
test

ubuntuで実行してみた結果

# uname -a
Linux ip-XX-XX-XX-XX 4.15.0-1032-aws #34-Ubuntu SMP Thu Jan 17 15:18:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
# docker-compose exec app /bin/sh -c "cat /app/Test.txt"
test
# docker-compose exec app /bin/sh -c "cat /app/test.txt"
cat: can't open '/app/test.txt': No such file or directory

感想

とてもハマりましたが、Dockerって最終的にホストOSのシステムコール使ってるんだなと実感しました(今回はdocker-composeが原因だったけど)。