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.10
をFROM centos
に変更)、正常に動作しました。 Ubuntuの問題のようです。
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をすばやく再構築する方法?
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の以下の設定は私にとっては有効です。 CoreOS
、Vagrant
、およびboot2docker
でテストしました。プロキシポートが3128
であるとします
ENV http_proxy=ip:3128
ENV https_proxy=ip:3128
ENV http_proxy 'http://ip:3128'
ENV https_proxy 'http://ip:3128'
形式に注意してください。中にはhttpが含まれているものと含まれていないものがあります。 IPアドレスが192.168.0.193の場合、設定は次のようになります。
ENV http_proxy=192.168.0.193:3128
ENV https_proxy=192.168.0.193:3128
ENV http_proxy 'http://192.168.0.193:3128'
ENV https_proxy 'http://192.168.0.193:3128'
cat /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"
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環境変数が設定されていることを確認してください。
Dockerfileのapt-getコマンドの前に、この行を配置する必要があります
COPY apt.conf /etc/apt/apt.conf
apt.confを作成することを忘れないでくださいDockerfile、apt.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はパスワードです。
小文字の環境変数で--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 .
同じ問題があり、別の小さな回避策が見つかりました: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
これはまだ多少粗雑ですが、私のために働いた
プロキシが正しく設定されていて、まだインターネットにアクセスできない場合は、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コンテナーによってコピーされます。
他の回答で示唆されているように、--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 .
Tim Potterが指摘したように、dockerfileでプロキシを設定するのは恐ろしいことです。イメージを構築するときに、企業ネットワークにプロキシを追加しますが、クラウドまたはプロキシが不要なプロキシサーバーが異なるDMZに展開する場合があります。
また、あなたのイメージをあなたの会社のn/w以外の人と共有することはできません。
wgetのプロキシを設定する場合は、これらの行をDockerfile
ENV http_proxy YOUR-PROXY-IP:PORT/
ENV https_proxy YOUR-PROXY-IP:PORT/
ENV all_proxy YOUR-PROXY-IP:PORT/
@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に従って。
私たちはやっています...
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リポジトリマスターブランチ)