
ローカル開発環境かどうかの判定
普段Railsを使って開発していると、環境の判定はRails.envで行うことができる。ローカル開発環境ではもちろん
1 | irb(main):001:0> Rails.env |
となる。
また、Rails.env == "development"としなくても
1 | irb(main):002:0> Rails.env.development? |
このように判定してくれるメソッドがある。
ところが、そうでないWebアプリケーションフレームワークもあるようで(ほんとにその機能がないかは定かではない)、ローカル開発環境かどうかの判定に
1 | if 'host.docker.internal' in os.environ['S3_URL']: |
という条件分岐を利用しているコードに出会った。
察しのいい方はわかると思いますが、S3にアクセスする際に、ローカルで稼働しているMinIOコンテナにアクセスすべきか、S3にアクセスすべきかの条件分岐のif文です。
この条件文が正しく動作せず苦労しました。
host.docker.internalについて
host.docker.internalというドメインが初見だったので調べてみると、Docker Desktop for xxで利用できる、コンテナから参照する場合のhostを指すドメインだということです。わたしの環境はDocker Desktop for Macを利用しているので利用できるはずです。
なるほど、であれば、コンテナからアクセスする際にhost.docker.internal:9000にアクセスすれば、コンテナからMinIOへアクセスできるはずですね。
host.docker.internalを利用する
先程のコードのようにS3_URLをhttp://host.docker.internal:9000とし、アプリケーションからファイルをPUTしてみました。
すると、正しくファイルをPUTできました。
host.docker.internalにアクセスできない場合
いろいろ調べてみるとhost.docker.internalというドメインにアクセスできないケースがあるようです。
その場合の対処法としては、docker-compose.ymlにextra_hostsの設定を行います。
extra_hosts
extra_hostsの説明は以下にありました。
https://docs.docker.jp/compose/compose-file/#extra-hosts
/etc/hostsに対してホストのマッピングを追加することができるようです。
対処法の例としては、hosts.docker.internalにアクセスするコンテナに対して
1 | extra_hosts: |
を追加してくださいとのことです。host-gatewayはホストのアドレスになるようですね。
/etc/hostsの確認
extra_hostsを設定した状態でコンテナの/etc/hostsファイルを確認します
1 | $ docker compose run --rm app /bin/bash |
host.docker.internalのレコードが追加されていました。
まとめ
コンテナからホストにアクセスする際にはhost.docker.internalというドメインでアクセスできる。
host.docker.internalでアクセスできない場合は、extra_hostsを利用して明示的に/etc/hostsファイルにレコードを追加する。