it-swarm.com.de

Wie kann man apt-get in einer Docking-Datei hinter einem Proxy ausführen?

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 Tritt die Zeitüberschreitung mit dem Fehler 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 im Host-System auch Folgendes ausgeführt:

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

Der Host kann apt-get Ohne Probleme ausführen.

Wie kann ich die Docker-Datei ändern, damit sie die Ubuntu-Server innerhalb des Containers erreicht?

pdate

Ich habe den Code in CentOS ausgeführt (indem ich FROM ubuntu:13.10 In FROM centos Geändert habe) und es hat gut funktioniert. Es scheint ein Problem mit Ubuntu zu sein.

63

[~ # ~] update [~ # ~]:

Sie haben eine falsche Großschreibung von Umgebungsvariablen in ENV. Richtig ist http_proxy. Ihr Beispiel sollte sein:

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

oder

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

Alle in ENV angegebenen Variablen werden jedem RUN-Befehl vorangestellt. Jeder RUN-Befehl wird in einem eigenen Container/einer eigenen Umgebung ausgeführt, sodass keine Variablen von vorherigen RUN-Befehlen übernommen 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 auch den Proxy für Docker-Deamon festlegen. Sie können den Proxy für den Daemon in Ubuntu unter /etc/default/docker Einstellen (dies hat keine Auswirkungen auf die Containereinstellungen).


Dies kann auch passieren, wenn Sie Ihren Proxy auf dem Host ausführen (d. H. Localhost, 127.0.0.1). Localhost on Host unterscheidet sich vom localhost im Container. In diesem Fall müssen Sie eine andere IP-Adresse (wie 172.17.42.1) verwenden, um Ihren Proxy an 0.0.0.0 zu binden. Wenn Sie eine Bindung an 0.0.0.0 herstellen, können Sie 172.17.42.1 anstelle von 127.0.0.1 für die Verbindung vom Container während docker build.

Sie können hier auch nach einem Beispiel suchen: Wie kann eine Docker-Datei mithilfe des Caches schnell wiederhergestellt werden?

83
Jiri

Aktualisiert am 02/10/2018

Mit der neuen Funktion in der Docker-Option --config Müssen Sie Proxy nicht mehr in Dockerfile einstellen. Sie können dasselbe Dockerfile für die Verwendung in und außerhalb der Unternehmensumgebung verwenden.

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

oder Umgebungsvariable 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/

Ich empfehle, Proxy mit httpProxy, httpsProxy, ftpProxy Und noProxy zu setzen (Das offizielle Dokument vermisst die Variable ftpProxy, was manchmal nützlich ist)

{
 "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"
   }
 }
}

Passen Sie die Proxy-IP und den Port an, falls erforderlich, und speichern Sie sie unter ~/.docker/config.json.

Nachdem Sie die Einstellungen korrekt vorgenommen haben, können Sie Docker Build und Docker Run wie gewohnt ausführen.

$ 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

Alte Antwort (außer Dienst gestellt)

Die folgende Einstellung in Dockerfile funktioniert für mich. Ich habe in CoreOS, Vagrant und boot2docker Getestet. Angenommen, der Proxy-Port ist 3128

In Centos:

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

In Ubuntu:

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

Achten Sie auf das Format, manche haben http, manche nicht, manche mit einem einzigen Kontingent. Wenn die IP-Adresse 192.168.0.193 lautet, lautet die Einstellung:

In Centos:

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

In Ubuntu:

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

Wenn Sie Proxy in Coreos einstellen müssen, um beispielsweise das Image zu ziehen

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

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

Du kannst den ... benutzen --build-arg Option, wenn Sie ein Dockerfile verwenden möchten.

Lesen Sie über einen Link auf https://github.com/docker/docker/issues/14634 den Abschnitt "Build with --build-arg with multiple HTTP_PROXY":

[[email protected] 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 .

ANMERKUNG: Stellen Sie auf Ihrem eigenen System sicher, dass Sie die Umgebungsvariablen HTTP_PROXY und NO_PROXY festgelegt haben.

37
zhanxw

vor jedem apt-get-Befehl in Ihrer Dockerfile sollten Sie diese Zeile einfügen

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

Vergessen Sie nicht, apt.conf in dem Ordner zu erstellen, in dem Sie die Dockerfile haben, den Inhalt der apt.conf Datei sollte so aussehen:

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

wenn Sie Benutzername und Passwort verwenden, um eine Verbindung zu Ihrem Proxy herzustellen, sollte die apt.conf wie folgt aussehen:

Acquire::socks::proxy "socks://USERNAME:[email protected]:PORT/";
Acquire::http::proxy "http://USERNAME:[email protected]:PORT/";
Acquire::https::proxy "http://USERNAME:[email protected]:PORT/";

beispielsweise :

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

Dabei ist foo der Benutzername und bar das Passwort.

11
Reza Farshi

Verwenden Sie --build-arg in Kleinbuchstaben der Umgebungsvariablen:

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

ich hatte das gleiche Problem und fand eine andere 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:

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

das ist noch etwas grob aber hat bei mir geklappt

3
user3813609

Wenn Sie die Proxys korrekt eingerichtet haben und dennoch nicht auf das Internet zugreifen können, kann dies an der DNS-Auflösung liegen. Überprüfen Sie /etc/resolve.conf Auf dem Host Ubuntu VM. Wenn es nameserver 127.0.1.1 Enthält, ist das falsch.

Führen Sie diese Befehle auf dem Host Ubuntu aus VM, um das Problem zu beheben:

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

Jetzt sollte /etc/resolv.conf Einen gültigen Wert für nameserver haben, der von den Docker-Containern kopiert wird.

3
wisbucky

Wie in anderen Antworten vorgeschlagen, könnte --build-arg Die Lösung sein. In meinem Fall musste ich zusätzlich zu den --network=Host - Optionen --build-arg Hinzufügen.

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

Wie Tim Potter betonte, ist es schrecklich, Proxy in Dockerfile zu setzen. Wenn Sie das Image erstellen, fügen Sie einen Proxy für Ihr Unternehmensnetzwerk hinzu, die Bereitstellung erfolgt jedoch möglicherweise in der Cloud oder in einer DMZ), in der kein Proxy erforderlich ist oder der Proxy-Server unterschiedlich ist.

Sie können Ihr Bild auch nicht mit anderen Personen außerhalb Ihres Unternehmens teilen.

1
Dhawal

und Wenn Sie einen Proxy für wget festlegen möchten, sollten Sie diese Zeile in Ihre Dockerfile einfügen

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

Eine leichte Alternative zu der Antwort von @Reza Farshi (die in meinem Fall besser funktioniert) besteht darin, die Proxy-Einstellungen mit echo über das Dockerfile nach /etc/apt/apt.conf Zu schreiben, z.

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

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.

1
Connor Goddard

Wir machen ...

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

und am Ende der Dockerfile ...

ENV http_proxy ""
ENV https_proxy ""

Auf diese Weise können (bis Docker Build-Umgebungsvariablen einführt) die Proxy-Umgebungsvariablen NUR für den Build verwendet werden, ohne dass sie verfügbar gemacht werden

Die Alternative zur Lösung besteht NICHT darin, Ihre Images lokal hinter einem Proxy zu erstellen, sondern Docker Ihre Images mithilfe von Docker "Automated Builds" erstellen zu lassen. Da Docker die Bilder nicht hinter Ihrem Proxy 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 bei einem Push-to-the-Github ausführt Hauptzweig)

1
danday74