Sie können Umgebungsvariablen mit dem -e
Flag an Ihre Container übergeben .
Ein Beispiel aus einem Startskript:
sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \
--name container_name dockerhub_id/image_name
Wenn Sie den Wert nicht in der Befehlszeile haben möchten, in der er angezeigt wird ps
usw., -e
können Sie den Wert aus der aktuellen Umgebung abrufen, wenn Sie ihn nur ohne Folgendes angeben =
:
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
Wenn Sie viele Umgebungsvariablen haben und diese insbesondere geheim sein sollen, können Sie eine env-Datei verwenden :
$ docker run --env-file ./env.list ubuntu bash
Das Flag --env-file verwendet einen Dateinamen als Argument und erwartet, dass jede Zeile das Format VAR = VAL hat, das das an --env übergebene Argument nachahmt. Kommentarzeilen müssen nur mit # vorangestellt werden
export PASSWORD=foo
stattdessen und die Variable wirddocker run
als Umgebungsvariable übergeben, damit diedocker run -e PASSWORD
Arbeit funktioniert.Sie können
-e
Parameter mit demdocker run ..
Befehl übergeben, wie hier erwähnt und wie von @errata erwähnt.Der mögliche Nachteil dieses Ansatzes besteht jedoch darin, dass Ihre Anmeldeinformationen in der Prozessliste angezeigt werden, in der Sie sie ausführen.
Um es sicherer zu machen, können Sie Ihre Anmeldeinformationen in einer Konfigurationsdatei schreiben und
docker run
mit--env-file
wie erwähnt hier . Anschließend können Sie den Zugriff auf diese Konfigurationsdatei so steuern, dass andere Benutzer, die Zugriff auf diesen Computer haben, Ihre Anmeldeinformationen nicht sehen.quelle
--env-file
, wenn Sie--env
Ihre env-Werte verwenden, werden sie mit der Standardsemantik der von Ihnen verwendeten Shell in Anführungszeichen gesetzt / maskiert. Bei Verwendung--env-file
der Werte, die Sie in Ihrem Container erhalten, ist dies jedoch anders. Der Befehl docker run liest nur die Datei, analysiert sie sehr einfach und leitet die Werte an den Container weiter. Dies entspricht nicht dem Verhalten Ihrer Shell. Nur ein kleiner Punkt, den Sie beachten sollten, wenn Sie eine Reihe von--env
Einträgen in einen konvertieren--env-file
.Wenn Sie "Docker-Compose" als Methode zum Hochfahren Ihrer Container verwenden, gibt es tatsächlich eine nützliche Möglichkeit, eine auf Ihrem Server definierte Umgebungsvariable an den Docker-Container zu übergeben.
docker-compose.yml
Angenommen, Sie drehen in Ihrer Datei einen einfachen Hapi-JS-Container und der Code sieht folgendermaßen aus:Angenommen, der lokale Server, auf dem sich Ihr Docker-Projekt befindet, verfügt über eine Umgebungsvariable mit dem Namen 'NODE_DB_CONNECT', die Sie an Ihren hapi-js-Container übergeben möchten, und der neue Name lautet 'HAPI_DB_CONNECT'. Dann würden Sie in der
docker-compose.yml
Datei die lokale Umgebungsvariable an den Container übergeben und wie folgt umbenennen:Ich hoffe, dies hilft Ihnen dabei, das Festcodieren einer Datenbankverbindungszeichenfolge in einer beliebigen Datei in Ihrem Container zu vermeiden!
quelle
Mit
docker-compose
können Sie env-Variablen in docker-compose.yml und anschließend alle Docker-Dateien erben, diedocker-compose
zum Erstellen von Images aufgerufen werden . Dies ist nützlich, wenn derDockerfile
RUN
Befehl umgebungsspezifische Befehle ausführen soll.(Ihre Shell ist
RAILS_ENV=development
bereits in der Umgebung vorhanden.)docker-compose.yml :
Dockerfile :
Auf diese Weise muss ich keine Umgebungsvariablen in Dateien oder
docker-compose
build
/up
Befehlen angeben :quelle
Verwenden
-e
Sie den Wert oder --env, um Umgebungsvariablen festzulegen (Standard []).Ein Beispiel aus einem Startskript:
Wenn Sie mehrere Umgebungen über die Befehlszeile verwenden möchten, verwenden Sie vor jeder Umgebungsvariablen das
-e
Flag.Beispiel:
Wenn Sie viele Variablen einrichten müssen, verwenden Sie das
--env-file
FlagZum Beispiel,
Weitere Hilfe finden Sie in der Docker-Hilfe:
Offizielle Dokumentation: https://docs.docker.com/compose/environment-variables/
quelle
ubuntu bash
? Gilt dies für Bilder, die mit Ubuntu als Basisbild erstellt wurden, oder für jedes Bild?-e
Argumenten vor langer Zeit einfügt! Ich kann nicht einmal verstehen, warum sie dies notwendig gemacht haben ...Es gibt einen netten Hack, wie Host-Computer-Umgebungsvariablen an einen Docker-Container weitergeleitet werden:
quelle
Für Amazon AWS ECS / ECR sollten Sie Ihre Umgebungsvariablen ( insbesondere Geheimnisse ) über einen privaten S3-Bucket verwalten. Siehe Blogbeitrag Verwalten von Geheimnissen für Amazon EC2 Container Service-basierte Anwendungen mithilfe von Amazon S3 und Docker .
quelle
Eine andere Möglichkeit besteht darin, die Kräfte von
/usr/bin/env
:quelle
Wenn Sie die Umgebungsvariablen
env.sh
lokal haben und sie beim Starten des Containers einrichten möchten, können Sie es versuchenDieser Befehl würde den Container mit einer Bash-Shell starten (ich möchte eine Bash-Shell, da
source
es sich um einen Bash-Befehl handelt), dieenv.sh
Datei als Quelle (die die Umgebungsvariablen festlegt) und die JAR-Datei ausführen.Das
env.sh
sieht so aus,Ich habe den
printenv
Befehl nur hinzugefügt, um zu testen, ob der eigentliche Quellbefehl funktioniert. Sie sollten es wahrscheinlich entfernen, wenn Sie bestätigen, dass der Quellbefehl ordnungsgemäß funktioniert oder die Umgebungsvariablen in Ihren Docker-Protokollen angezeigt werden.quelle
--env-file
Argument für einendocker run
Befehl anzugeben . Wenn Sie beispielsweise eine Anwendung mithilfe der Google App Engine bereitstellen und die im Container ausgeführte App Umgebungsvariablen benötigt, die im Docker-Container festgelegt sind, haben Sie keinen direkten Ansatz zum Festlegen der Umgebungsvariablen, da Sie keine Kontrolle über dendocker run
Befehl haben . In einem solchen Fall könnten Sie ein Skript haben, das die env-Variablen mit beispielsweise KMS entschlüsselt und zu dem hinzufügtenv.sh
, aus dem die env-Variablen festgelegt werden können..
regulären Befehl POSIX (Punkt)sh
anstelle von verwendensource
. (source
ist das gleiche wie.
)Verwenden von jq zum Konvertieren der Umgebung in JSON:
Dies erfordert jq Version 1.6 oder neuer
Dies verdrängt den Host env als json, im Wesentlichen wie in Dockerfile:
quelle
docker run -e HOST_ENV="$env_as_json" <image>
? In meinem Fall scheint Docker keine Variablen oder Subshells (${}
oder$()
) aufzulösen, wenn sie als Docker-Argumente übergeben werden. Zum Beispiel:A=123 docker run --rm -it -e HE="$A" ubuntu
dann in diesem Container:root@947c89c79397:/# echo $HE root@947c89c79397:/#
.... DieHE
Variable schafft es nicht.Wir können auch Maschinenumgebungsvariablen mit dem Flag -e und $ hosten:
Vor dem Ausführen müssen lokale Env-Variablen und -Dateien oder kurz vor der Verwendung exportiert (dh festgelegt) werden
Mit dieser Methode setzen Sie die env-Variable in meinem Fall automatisch mit Ihrem Vornamen (MG_HOST, MG_USER).
Zusätzlich:
Wenn Sie Python verwenden, können Sie über Docker auf diese Envment-Variable zugreifen
quelle
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
Ist eine Möglichkeit, die in a gespeicherten Daten zu erfassen.env
und an Docker weiterzuleiten, ohne dass etwas unsicher gespeichert wird (Sie können also nicht nurdocker history
Schlüssel anzeigen und abrufen.Angenommen, Sie haben eine Menge AWS-Inhalte auf Ihre
.env
Art und Weise:Wenn Sie Docker mit `` `Docker ausführen, führen Sie --rm -it --env-file <(bash -c 'env | grep AWS_') aus, um alles zu erfassen und sicher zu übergeben, damit Sie aus dem Container heraus darauf zugreifen können.
quelle