web-dev-qa-db-ja.com

プロキシの背後のdockerfileで「apt-get」を実行するにはどうすればよいですか?

Docker(バージョン0.8.1、ビルドa1598d1)で仮想マシン(Ubuntu 13.10)を実行しています。 dockerfileを使用してイメージを構築しようとしています。最初に、パッケージを更新します(以下のコードを使用して-プロキシは難読化されます)が、apt-getがエラーでタイムアウトします:Could not resolve 'archive.ubuntu.com'

FROM ubuntu:13.10
ENV HTTP_PROXY <HTTP_PROXY>
ENV HTTPS_PROXY <HTTPS_PROXY>
RUN export http_proxy=$HTTP_PROXY
RUN export https_proxy=$HTTPS_PROXY
RUN apt-get update && apt-get upgrade

また、ホストシステムで次を実行しました。

Sudo HTTP_PROXY=http://<PROXY_DETAILS>/ docker -d &

ホストは問題なくapt-getを実行できます。

コンテナ内からubuntuサーバーに到達できるようにdockerfileを変更するにはどうすればよいですか?

更新

CentOSでコードを実行し(FROM ubuntu:13.10FROM centosに変更)、正常に動作しました。 Ubuntuの問題のようです。

63

UPDATE

ENVで環境変数の大文字化が間違っています。正しいものはhttp_proxyです。例は次のとおりです。

FROM ubuntu:13.10
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN apt-get update && apt-get upgrade

または

FROM centos
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN yum update 

ENVで指定されたすべての変数は、すべてのRUNコマンドの先頭に追加されます。すべてのRUNコマンドは独自のコンテナ/環境で実行されるため、以前のRUNコマンドから変数を継承しません!

注:これを機能させるためにプロキシを使用してdockerデーモンを呼び出す必要はありませんが、画像などを取得する場合は、dockerデーモンのプロキシも設定する必要があります。 Ubuntuの/etc/default/dockerでデーモンのプロキシを設定できます(コンテナの設定には影響しません)。


また、これはホストでプロキシを実行する(つまり、localhost、127.0.0.1)の場合に発生する可能性があります。ホスト上のローカルホストは、コンテナ内のローカルホストとは異なります。このような場合、別のIP(172.17.42.1など)を使用してプロキシをバインドする必要があります。0.0.0.0にバインドする場合は、docker build中のコンテナからの接続に127.0.0.1ではなく172.17.42.1を使用できます。

ここで例を探すこともできます: キャッシュを使用してdockerfileをすばやく再構築する方法?

83
Jiri

2018年2月10日に更新

Dockerオプション--configの新機能により、Dockerfileでプロキシを設定する必要がなくなりました。企業環境内外で同じDockerfileを使用できます。

--config string      Location of client config files (default "~/.docker")

または環境変数DOCKER_CONFIG

`DOCKER_CONFIG` The location of your client configuration files.

$ export DOCKER_CONFIG=~/.docker

https://docs.docker.com/engine/reference/commandline/cli/

https://docs.docker.com/network/proxy/

httpProxy, httpsProxy, ftpProxyおよびnoProxyを使用してプロキシを設定することをお勧めします(公式ドキュメントでは、変数ftpProxyが欠落しています。

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:3001",
     "httpsProxy": "http://127.0.0.1:3001",
     "ftpProxy": "http://127.0.0.1:3001",
     "noProxy": "*.test.example.com,.example2.com"
   }
 }
}

必要に応じてプロキシIPとポートを調整し、~/.docker/config.jsonに保存します

正しく設定したら、通常どおりdocker buildとdocker runを実行できます。

$ docker build -t demo . 

$ docker run -ti --rm demo env|grep -ri proxy
(standard input):http_proxy=http://127.0.0.1:3001
(standard input):HTTPS_PROXY=http://127.0.0.1:3001
(standard input):https_proxy=http://127.0.0.1:3001
(standard input):NO_PROXY=*.test.example.com,.example2.com
(standard input):no_proxy=*.test.example.com,.example2.com
(standard input):FTP_PROXY=http://127.0.0.1:3001
(standard input):ftp_proxy=http://127.0.0.1:3001
(standard input):HTTP_PROXY=http://127.0.0.1:3001

古い回答(廃止)

Dockerfileの以下の設定は私にとっては有効です。 CoreOSVagrant、およびboot2dockerでテストしました。プロキシポートが3128であるとします

Centosの場合:

ENV http_proxy=ip:3128 
ENV https_proxy=ip:3128

Ubuntuの場合:

ENV http_proxy 'http://ip:3128'
ENV https_proxy 'http://ip:3128'

形式に注意してください。中にはhttpが含まれているものと含まれていないものがあります。 IPアドレスが192.168.0.193の場合、設定は次のようになります。

Centosの場合:

ENV http_proxy=192.168.0.193:3128 
ENV https_proxy=192.168.0.193:3128

Ubuntuの場合:

ENV http_proxy 'http://192.168.0.193:3128'
ENV https_proxy 'http://192.168.0.193:3128'

Coreosでプロキシを設定する必要がある場合、たとえばイメージをプルする場合

cat /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"
47
BMW

Dockerfileを使用してビルドする場合は、--build-argオプションを使用できます。

https://github.com/docker/docker/issues/14634 のリンクから、「-build-arg with multiple HTTP_PROXY」セクションを参照してください:

[root@pppdc9prda2y Java]# docker build 
  --build-arg https_proxy=$HTTP_PROXY --build-arg http_proxy=$HTTP_PROXY 
  --build-arg HTTP_PROXY=$HTTP_PROXY --build-arg HTTPS_PROXY=$HTTP_PROXY 
  --build-arg NO_PROXY=$NO_PROXY  --build-arg no_proxy=$NO_PROXY -t Java .

注:独自のシステムで、HTTP_PROXYおよびNO_PROXY環境変数が設定されていることを確認してください。

37
zhanxw

Dockerfileのapt-getコマンドの前に、この行を配置する必要があります

COPY apt.conf /etc/apt/apt.conf

apt.confを作成することを忘れないでくださいDockerfileapt.confファイルの内容は次のようになります。

Acquire::socks::proxy "socks://YOUR-PROXY-IP:PORT/";
Acquire::http::proxy "http://YOUR-PROXY-IP:PORT/";
Acquire::https::proxy "http://YOUR-PROXY-IP:PORT/";

ユーザー名とパスワードを使用してプロキシに接続する場合、apt.confは次のようになります。

Acquire::socks::proxy "socks://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";
Acquire::http::proxy "http://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";
Acquire::https::proxy "http://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";

例えば ​​:

Acquire::https::proxy "http://foo:[email protected]:8080/";

fooはユーザー名で、barはパスワードです。

11
Reza Farshi

小文字の環境変数で--build-argを使用します。

docker build --build-arg http_proxy=http://proxy:port/ --build-arg https_proxy=http://proxy:port/ --build-arg ftp_proxy=http://proxy:port --build-arg no_proxy=localhost,127.0.0.1,company.com -q=false .
7
Gaetan

同じ問題があり、別の小さな回避策が見つかりました:dockerビルド環境から追加されるプロビジョニングスクリプトがあります。スクリプトでは、pingチェックに応じて環境変数を設定します。

Dockerfile:

ADD script.sh /tmp/script.sh
RUN /tmp/script.sh

script.sh:

if ping -c 1 ix.de ; then
    echo "direct internet doing nothing"
else
    echo "proxy environment detected setting proxy"
    export http_proxy=<proxy address>
fi

これはまだ多少粗雑ですが、私のために働いた

3
user3813609

プロキシが正しく設定されていて、まだインターネットにアクセスできない場合は、DNS解決である可能性があります。ホストUbuntu VMで/etc/resolve.confを確認します。 nameserver 127.0.1.1が含まれている場合、それは間違っています。

ホストUbuntu VMで次のコマンドを実行して修正します。

Sudo vi /etc/NetworkManager/NetworkManager.conf
# Comment out the line `dns=dnsmasq` with a `#`

# restart the network manager service
Sudo systemctl restart network-manager

cat /etc/resolv.conf

/etc/resolv.confには、ネームサーバーの有効な値が必要です。これは、Dockerコンテナーによってコピーされます。

3
wisbucky

他の回答で示唆されているように、--build-argが解決策かもしれません。私の場合、--network=Hostオプションに加えて--build-argを追加する必要がありました。

docker build -t <TARGET> --build-arg http_proxy=http://<IP:PORT> --build-arg https_proxy=http://<IP:PORT> --network=Host .
3
user4780495

Tim Potterが指摘したように、dockerfileでプロキシを設定するのは恐ろしいことです。イメージを構築するときに、企業ネットワークにプロキシを追加しますが、クラウドまたはプロキシが不要なプロキシサーバーが異なるDMZに展開する場合があります。

また、あなたのイメージをあなたの会社のn/w以外の人と共有することはできません。

1
Dhawal

wgetのプロキシを設定する場合は、これらの行をDockerfile

ENV http_proxy YOUR-PROXY-IP:PORT/
ENV https_proxy YOUR-PROXY-IP:PORT/
ENV all_proxy YOUR-PROXY-IP:PORT/
1
Reza Farshi

@Reza Farshiが提供する回答(これは私の場合はよりうまく機能します)のわずかな代替策は、Dockerfileを介してechoを使用して、プロキシ設定を/etc/apt/apt.confに書き込むことです。

FROM ubuntu:16.04

RUN echo "Acquire::http::proxy \"$HTTP_PROXY\";\nAcquire::https::proxy \"$HTTPS_PROXY\";" > /etc/apt/apt.conf

# Test that we can now retrieve packages via 'apt-get'
RUN apt-get update

この方法の利点は、ホストから設定ファイルをコピーするのではなく、イメージのビルド時にプロキシアドレスを動的に渡すことができることです。

例えば.

docker build --build-arg HTTP_PROXY=http://<Host>:<port> --build-arg HTTPS_PROXY=http://<Host>:<port> .

docker build docsに従って。

1
Connor Goddard

私たちはやっています...

ENV http_proxy http://9.9.9.9:9999
ENV https_proxy http://9.9.9.9:9999

そしてdockerfileの最後に...

ENV http_proxy ""
ENV https_proxy ""

これは、今のところ(dockerがビルド環境変数を導入するまで)、プロキシ環境変数を公開せずにビルドのみに使用できるようにします

ソリューションの代替策は、プロキシの背後でローカルにイメージをビルドするのではなく、Dockerがdocker "automated builds"を使用してイメージをビルドできるようにすることです。 Dockerはプロキシの背後で画像を構築していないため、問題は解決します。自動ビルドの例は、次で入手できます...

https://github.com/danday74/docker-nginx-lua (GITHUBリポジトリ)

https://registry.hub.docker.com/u/danday74/nginx-lua (自動ビルドを使用してgithubリポジトリを監視し、githubへのプッシュでdockerビルドを行うDOCKERリポジトリマスターブランチ)

1
danday74