Ich arbeite an einer Aufgabe, bei der ein Docker-Image mit centOs als Basis mithilfe einer Docker-Datei erstellt wird . Für einen der Schritte in der Docker- Datei müssen die ENV-Variablen http_proxy und https_proxy festgelegt werden, damit sie hinter dem Proxy arbeiten können.
Da diese Docker-Datei von mehreren Teams mit unterschiedlichen Proxys verwendet wird, möchte ich vermeiden, dass die Docker-Datei für jedes Team bearbeitet werden muss. Stattdessen suche ich nach einer Lösung, mit der ich ENV-Variablen zur Erstellungszeit übergeben kann, z.
sudo docker build -e http_proxy = irgendein Wert.
Ich bin mir nicht sicher, ob es bereits eine Option gibt, die dies bietet. Vermisse ich etwas
docker run -e http_proxy http://1.2.3.4:3128 -e https_proxy 1.2.3.4:3129
? Das Dokument vondocker run
docs.docker.com/reference/commandline/runAntworten:
Container können mit
build arguments
(in Docker 1.9+) erstellt werden, die wie Umgebungsvariablen funktionieren.Hier ist die Methode:
und dann einen Produktionscontainer bauen:
docker build --build-arg APP_ENV=prod .
Für Ihr spezielles Problem:
und dann ausführen:
docker build --build-arg http_proxy=10.11.24.31 .
Beachten Sie, dass Sie beim Erstellen Ihrer Container mit diesen Build-Argumenten in der Datei angeben
docker-compose
können , jedoch nicht in der Befehlszeile. Sie können jedoch die Variablensubstitution in der Datei verwenden, die Umgebungsvariablen verwendet .docker-compose.yml
docker-compose.yml
quelle
ENV APP_ENV ${APP_ENV}
wird nicht benötigt. Es ist genug, um darauf zuARG APP_ENV
verzichten,=local
und es greift nach dem Build-Argument und verwendet es als eine beliebige Variable, die vonENV
ARG
nicht als Umgebungsvariable beibehalten , wenn das Docker-Image ausgeführt wird. DurchENV APP_ENV ${APP_ENV}
die Verwendung wird sichergestellt, dass die Umgebungsvariable weiterhin verfügbar ist, wenn der Container ausgeführt wird.ENV
Befehlszeile zu verlassen. Wie hilft es also,ARG
allein zu sein? Sie müssen,ARG
damit Sie eine über übergeben können,--build-arg
und dann müssen SieENV
sie in eine Umgebungsvariable kopieren, damit das Bild erhalten bleibt.Also musste ich dies durch Ausprobieren herausfinden, da viele Leute erklären, dass Sie bestehen können
ARG
->ENV
aber es funktioniert nicht immer, da es sehr wichtig ist, ob das ARG vor oder nach demFROM
Tag definiert wird.Das folgende Beispiel sollte dies klar erklären. Mein Hauptproblem war ursprünglich, dass alle meine ARGS vorher definiert wurden,
FROM
was dazu führte, dass alleENV
immer undefiniert waren.quelle
Ich sah mich der gleichen Situation gegenüber.
Laut der Antwort von Sin30 ist die hübsche Lösung die Verwendung von Shell,
quelle