1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Cntlm設定しているLinuxのdocker-composeでプロキシ設定host.docker.internal:3128を使おうとしてビルド失敗

Last updated at Posted at 2021-03-20

結論

Linuxのdocker-compose.ymlバージョン3でhost.docker.internalを使ってDockerホスト上にあるProxyを通ってインターネット接続させながらイメージビルドしたいときはbuildのところでもextra_hosts"host.docker.internal:host-gateway"を書く必要あり。

https://github.com/docker/compose/issues/7323

docker-compose.override.yml
version: "3"
services:
  myservice:
    build:
      extra_hosts:
        - "host.docker.internal:host-gateway"
    extra_hosts:
      - "host.docker.internal:host-gateway"

環境

bash
$ docker --version
Docker version 20.10.5, build 55c4c88
$ docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f

背景

LinuxでDockerを使う際、コンテナ内からDockerホストにアクセスしたい場合に、Docker Desktopで使えるhost.docker.internalを使うことはできません。1

ではCntlmを使ってhttp://localhost:3128のようなポートにローカルProxyサーバーを作ってそこを経由しないとインターネット接続できないような場合にはどう設定するか?
http://host.docker.internal:3128の代わりにDockerホストのIPアドレスを書いてhttp://XXX.XXX.XXX.XXX:3128と設定するとうまくいきます。

~/.docker/config.json
{
    "proxies": {
        "default": {
            "httpProxy": "http://XXX.XXX.XXX.XXX:3128",
            "httpsProxy": "http://XXX.XXX.XXX.XXX:3128",
            "noProxy": "localhost"
        }
    }
}

ただしこの設定の仕方は、他のコンピュータからこのコンピュータのDockerデーモンに接続する(他のコンピュータの環境変数DOCKER_HOSTでこのコンピュータを設定する)ときに問題を引き起こします。
コンテナ内に作られるプロキシ環境変数は、接続元のコンピュータの~/.docker/config.jsonから作られるからです。

そのため接続元のコンピュータからすると、接続先に合わせて毎回~/.docker/config.jsonを書き直さないとコンテナはインターネットに接続できません。

~/.docker/config.json
{
    "proxies": {
        "default": {
            "httpProxy": "http://host.docker.internal:3128",
            "httpsProxy": "http://host.docker.internal:3128",
            "noProxy": "localhost"
        }
    }
}

もしもすべてのコンピュータでDockerコンテナのプロキシ設定を↑のように統一できていれば、接続先に合わせて毎回~/.docker/config.jsonを書き直す必要はなく、もちろんプロジェクトのソースコードの中にもプロキシ設定を書く必要はなくなるわけです。

--add-host=host.docker.internal:host-gateway

https://github.com/docker/for-linux/issues/264

上記issue内で散々書かれているように、現在Linux上のDockerコンテナ内でhost.docker.internalを使うには docker builddocker runの際に--add-host=host.docker.internal:host-gatewayを付けてやればよく、docker-compose upでコンテナを作る場合にはdocker-compose.ymlのextra_hostsのところに書けば良いのですが、docker-compose.ymlバージョン2ではbuildのところにextra_hostsを指定しなくてもビルド中にも追加のホスト名を解決できたのにバージョン3では今のところbuildにも指定しないとビルド中はホスト名を解決できないです。

参考記事

  1. host.docker.internalはあくまでDocker Desktopの開発時に使うためのものでLinuxの本番環境でいきなり使えるようになるのはまずい」という言い分も分からないでもないのですが、Linuxで開発している人の立場は……。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?