Ich verwende eine virtuelle Maschine (Ubuntu 13.10) mit Docker (Version 0.8.1, Build a1598d1). Ich versuche, ein Image mit einer Docker-Datei zu erstellen. Zuerst möchte ich die Pakete aktualisieren (mit dem folgenden Code - der Proxy ist verschleiert), aber apt-get
mit dem Fehler tritt eine Zeitüberschreitung auf : 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
Ich habe auch Folgendes im Host-System ausgeführt:
sudo HTTP_PROXY=http://<PROXY_DETAILS>/ docker -d &
Der Host kann problemlos ausgeführt apt-get
werden.
Wie kann ich die Docker-Datei so ändern, dass sie die Ubuntu-Server aus dem Container heraus erreicht?
Aktualisieren
Ich habe den Code in CentOS ausgeführt (Ändern FROM ubuntu:13.10
in FROM centos
) und es hat gut funktioniert. Es scheint ein Problem mit Ubuntu zu sein.
docker
apt
http-proxy
Christopher Louden
quelle
quelle
Antworten:
UPDATE :
Sie haben eine falsche Großschreibung von Umgebungsvariablen in ENV. Richtig ist
http_proxy
. Ihr Beispiel sollte sein:oder
Allen in ENV angegebenen Variablen wird jedem RUN-Befehl vorangestellt. Jeder RUN-Befehl wird in einem eigenen Container / einer eigenen Umgebung ausgeführt, sodass keine Variablen von früheren RUN-Befehlen geerbt werden!
Hinweis: Es ist nicht erforderlich, den Docker-Daemon mit Proxy aufzurufen, damit dies funktioniert. Wenn Sie jedoch Bilder usw. abrufen möchten, müssen Sie den Proxy auch für Docker-Deamon festlegen. Sie können den Proxy für den Daemon in
/etc/default/docker
Ubuntu festlegen (dies hat keine Auswirkungen auf die Containereinstellung).Dies kann auch passieren, wenn Sie Ihren Proxy auf dem Host ausführen (z. B. localhost, 127.0.0.1). Localhost auf dem Host unterscheidet sich von localhost im Container. In diesem Fall müssen Sie eine andere IP-Adresse (z. B. 172.17.42.1) verwenden, um Ihren Proxy an 0.0.0.0 zu binden. Wenn Sie an 0.0.0.0 binden, können Sie während der Verbindung von Container 172.17.42.1 anstelle von 127.0.0.1 verwenden
docker build
.Hier können Sie auch nach einem Beispiel suchen: Wie kann eine Docker-Datei mithilfe des Cache schnell wiederhergestellt werden?
quelle
FROM
) mit den gleichen Proxy-Einstellungen.ENV http_proxy corporate-proxy.com
in Ihrer Docker-Datei sein. Das ist ziemlich ekelhaft, da Sie Ihre Docker-Datei nicht mit anderen Personen außerhalb Ihres Unternehmens teilen können. Ich habe dies gerade überprüft, indem ich polipo in einem Container ausgeführt habe, während ich versucht habe,apt-get install
Befehle für die Entwicklung von Docker-Dateien zwischenzuspeichern. Vielleicht wird eine zukünftige Version von Docker eine magische iptables-Konfiguration haben, die ein transparentes Proxying von HTTP-Anforderungen ermöglicht?polipo parentProxy=corporate-proxy.com
) einrichten und anschließend den transparenten Proxy mit iptables einrichten :iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner <polipo-user> --dport 80 -j REDIRECT --to-port 8123
.Aktualisiert am 02/10/2018
Mit der neuen Funktion in der Docker-Option
--config
müssen Sie den Proxy in Dockerfile nicht mehr festlegen. Sie können dieselbe Docker-Datei für die Verwendung in und außerhalb der Unternehmensumgebung verwenden.oder Umgebungsvariable
DOCKER_CONFIG
https://docs.docker.com/engine/reference/commandline/cli/
https://docs.docker.com/network/proxy/
Ich empfehle, den Proxy mit
httpProxy, httpsProxy, ftpProxy
und festzulegennoProxy
((Im offiziellen Dokument fehlt die Variable,ftpProxy
was manchmal nützlich ist).Passen Sie die Proxy-IP und den Port bei Bedarf an und speichern Sie unter
~/.docker/config.json
Nachdem Sie es richtig eingestellt haben, können Sie Docker Build und Docker Run wie gewohnt ausführen.
Alte Antwort (Stillgelegt)
Die folgende Einstellung in Dockerfile funktioniert für mich. Getestet habe ich in
CoreOS
,Vagrant
undboot2docker
. Angenommen, der Proxy-Port ist3128
In Centos:
In Ubuntu:
Achten Sie auf das Format, einige haben http, andere nicht, andere mit einem einzigen Kontingent. Wenn die IP-Adresse 192.168.0.193 lautet, lautet die Einstellung wie folgt:
In Centos:
In Ubuntu:
Wenn Sie in Coreos einen Proxy festlegen müssen, um beispielsweise das Image abzurufen
quelle
80
: stackoverflow.com/a/46949277/1654763$DOCKER_CONFIG
sollte auf ein Verzeichnis verweisen und nicht direkt auf dieconfig.json
DateiSie können die
--build-arg
Option verwenden, wenn Sie mit einer Docker-Datei erstellen möchten.Einen Link unter https://github.com/docker/docker/issues/14634 finden Sie im Abschnitt "Erstellen mit --build-arg mit mehreren HTTP_PROXY":
ANMERKUNG: Stellen Sie auf Ihrem eigenen System sicher, dass Sie die Umgebungsvariablen HTTP_PROXY und NO_PROXY festgelegt haben.
quelle
Vor jedem apt-get-Befehl in Ihrer Docker-Datei sollten Sie diese Zeile einfügen
Dont'f vergessen erstellen apt.conf im selben Ordner , dass Sie das haben Dockerfile , den Inhalt der apt.conf sollte Datei wie folgt sein:
Wenn Sie Benutzername und Passwort verwenden, um eine Verbindung zu Ihrem Proxy herzustellen, sollte die apt.conf wie folgt aussehen:
zum Beispiel :
Wobei das foo der Benutzername und die Leiste das Passwort ist.
quelle
Acquire::socks::proxy
bedeutet, den Proxy für alle URLs festzulegen, die mit einemsocks
Schema beginnen. Da Siesources.list
keinesocks://
URLs haben, wird diese Zeile vollständig ignoriert. Ich werde eine Bearbeitung einreichen, um dies zu korrigieren./etc/apt/apt.conf.d/<config>
onjessie
, daher muss die Dockerfile-COPY
Direktive hier aktualisiert werden.Verwenden Sie --build-arg in Umgebungsvariablen in Kleinbuchstaben:
quelle
Wie von anderen Antworten vorgeschlagen,
--build-arg
kann die Lösung sein. In meinem Fall musste ich--network=host
zusätzlich zu den--build-arg
Optionen hinzufügen .quelle
Eine leichte Alternative zu der Antwort von @Reza Farshi (die in meinem Fall besser funktioniert) besteht darin, die Proxy-Einstellungen für die
/etc/apt/apt.conf
Verwendungecho
über die Docker-Datei zu schreiben, z.Der Vorteil dieses Ansatzes besteht darin, dass die Proxy-Adressen zum Zeitpunkt der Image-Erstellung dynamisch übergeben werden können, anstatt die Einstellungsdatei vom Host kopieren zu müssen.
z.B
docker build --build-arg HTTP_PROXY=http://<host>:<port> --build-arg HTTPS_PROXY=http://<host>:<port> .
gemäß Docker Build Docs.
quelle
Ich hatte das gleiche Problem und fand eine weitere kleine Problemumgehung: Ich habe ein Provisioner-Skript, das aus der Docker-Build-Umgebung hinzugefügt wird. Im Skript setze ich die Umgebungsvariable abhängig von einer Ping-Prüfung:
Dockerfile:
script.sh:
das ist noch etwas grob aber hat bei mir funktioniert
quelle
Wenn Sie die Proxys korrekt eingerichtet haben und das Internet immer noch nicht erreichen können, kann dies an der DNS-Auflösung liegen. Überprüfen Sie
/etc/resolve.conf
die Host-Ubuntu-VM. Wenn es enthältnameserver 127.0.1.1
, ist das falsch.Führen Sie die folgenden Befehle auf der Ubuntu-VM des Hosts aus, um das Problem zu beheben:
Jetzt
/etc/resolv.conf
sollte ein gültiger Wert für den Nameserver vorhanden sein, der von den Docker-Containern kopiert wird.quelle
pip install
mit Docker hinter einem Proxy zu arbeiten. Das wollte das OP nicht wirklich, hat mir aber sehr geholfen! :)Wir machen ...
und am Ende der Docker-Datei ...
Auf diese Weise (bis Docker Build-Env-Variablen einführt) können die Proxy-Env-Variablen NUR für den Build verwendet werden, ohne sie verfügbar zu machen
Die Alternative zur Lösung besteht NICHT darin, Ihre Bilder lokal hinter einem Proxy zu erstellen, sondern Docker Ihre Bilder mithilfe von "automatisierten Builds" für Docker für Sie erstellen zu lassen. Da Docker die Images hinter Ihrem Proxy nicht erstellt, ist das Problem behoben. Ein Beispiel für einen automatisierten Build finden Sie unter ...
https://github.com/danday74/docker-nginx-lua (GITHUB-Repo)
https://registry.hub.docker.com/u/danday74/nginx-lua (DOCKER-Repo, das das Github-Repo mithilfe eines automatisierten Builds überwacht und einen Docker-Build auf einem Push zum Github-Master-Zweig ausführt)
quelle
und Wenn Sie einen Proxy für wget festlegen möchten, sollten Sie diese Zeile in Ihre Docker-Datei einfügen
quelle
Wie Tim Potter betonte, ist es schrecklich, einen Proxy in der Docker-Datei zu setzen. Beim Erstellen des Images fügen Sie einen Proxy für Ihr Unternehmensnetzwerk hinzu, stellen ihn jedoch möglicherweise in der Cloud oder in einer DMZ bereit, in der kein Proxy erforderlich ist oder der Proxyserver anders ist.
Sie können Ihr Bild auch nicht mit anderen Personen außerhalb Ihres Unternehmens teilen.
quelle