Yanıtlar:
Ortam değişkenlerini -e
bayraklı kaplarınıza iletebilirsiniz .
Bir başlangıç komut dosyasından bir örnek:
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
Veya, ps
vb. Tarafından görüntüleneceği komut satırında değere sahip olmak istemiyorsanız, değeri -e
yalnızca şu olmadan verirseniz geçerli ortamdan alabilir =
:
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
Birçok ortam değişkeniniz varsa ve özellikle bunların gizli olması gerekiyorsa, bir env dosyası kullanabilirsiniz :
$ docker run --env-file ./env.list ubuntu bash
--Env dosyası bayrağı, bir dosya adını bağımsız değişken olarak alır ve her satırın VAR = VAL biçiminde olmasını bekler ve --env öğesine iletilen bağımsız değişkeni taklit eder. Yorum satırlarının başına yalnızca # işareti konmalıdır
export PASSWORD=foo
yerine yapın ve değişken docker run
bir ortam değişkeni olarak geçerek docker run -e PASSWORD
iş yapar.
Burada ve @errata tarafından belirtildiği gibi komutla -e
parametreleri kullanarak geçebilirsiniz.
Ancak, bu yaklaşımın olası dezavantajı, kimlik bilgilerinizin çalıştırdığınız işlem listesinde görüntülenmesidir.
Daha güvenli hale getirmek için, bir yapılandırma dosyasında kimlik bilgilerinizi yazmak ve yapabilirler ile belirtildiği gibi burada . Ardından, bu makineye erişimi olan diğer kişilerin kimlik bilgilerinizi görmemesi için bu yapılandırma dosyasının erişimini denetleyebilirsiniz.docker run ..
docker run
--env-file
--env-file
kullandığınız --env
env değerleriniz kullandığınız kabuğun standart semantiği ile alıntılanacak / kaçacaktır, ancak --env-file
değerleri kullanırken kabınızın içine gireceğiniz farklı olacaktır. Docker run komutu sadece dosyayı okur, çok temel ayrıştırma yapar ve değerleri kaba aktarır, kabuğunuzun davranış biçimine eşdeğer değildir. Sadece bir grup --env
girişi bir --env-file
.
Kapsayıcılarınızı döndürme yöntemi olarak 'docker-compose' yöntemini kullanıyorsanız, sunucunuzda tanımlı bir ortam değişkenini Docker kapsayıcısına geçirmenin kullanışlı bir yolu vardır.
Senin içinde docker-compose.yml
dosyanın, en temel bir hapi-js kabı ve kod görünüyor gibi dönerken diyelim:
hapi_server:
container_name: hapi_server
image: node_image
expose:
- "3000"
Docker projenizin bulunduğu yerel sunucunun hapi-js kabınıza iletmek istediğiniz 'NODE_DB_CONNECT' adlı bir ortam değişkenine sahip olduğunu ve yeni adının 'HAPI_DB_CONNECT' olmasını istediğinizi varsayalım. Sonra docker-compose.yml
dosyada, yerel ortam değişkenini kapsayıcıya geçirir ve şöyle adlandırırsınız:
hapi_server:
container_name: hapi_server
image: node_image
environment:
- HAPI_DB_CONNECT=${NODE_DB_CONNECT}
expose:
- "3000"
Bu kapsayıcı herhangi bir dosyada bir veritabanı bağlantı dizesi sabit kodlama önlemek için yardımcı olacağını umuyoruz!
Kullanarak docker-compose
, docker-compose.yml dosyasında env değişkenlerini ve daha sonra docker-compose
görüntüleri oluşturmak için çağrılan tüm Docker dosya (lar) ını devralabilirsiniz . Dockerfile
RUN
Komutun ortama özgü komutları yürütmesi gerektiğinde yararlıdır .
(kabuğunuz RAILS_ENV=development
çevrede zaten var)
docker-compose.yml :
version: '3.1'
services:
my-service:
build:
#$RAILS_ENV is referencing the shell environment RAILS_ENV variable
#and passing it to the Dockerfile ARG RAILS_ENV
#the syntax below ensures that the RAILS_ENV arg will default to
#production if empty.
#note that is dockerfile: is not specified it assumes file name: Dockerfile
context: .
args:
- RAILS_ENV=${RAILS_ENV:-production}
environment:
- RAILS_ENV=${RAILS_ENV:-production}
Dockerfile :
FROM ruby:2.3.4
#give ARG RAILS_ENV a default value = production
ARG RAILS_ENV=production
#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed
#by the subsequent RUN call within the container
ENV RAILS_ENV $RAILS_ENV
#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi
Ben dosyaları veya çevre değişkenleri belirtme ihtiyacını yok Bu şekilde docker-compose
build
/ up
komutlar:
docker-compose build
docker-compose up
-e
Ortam değişkenlerini ayarlamak için veya --env değerini kullanın (varsayılan []).
Bir başlangıç komut dosyasından bir örnek:
docker run -e myhost='localhost' -it busybox sh
Komut satırından birden çok ortam kullanmak istiyorsanız, her ortam değişkeninden önce -e
bayrağı kullanın .
Misal:
sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh
Not: Kapsayıcı adını bundan önce değil, ortam değişkeninden sonra koyduğunuzdan emin olun.
Çok sayıda değişken ayarlamanız gerekiyorsa, --env-file
bayrağı kullanın
Örneğin,
$ docker run --env-file ./my_env ubuntu bash
Diğer yardımlar için Docker yardımına bakın:
$ docker run --help
Resmi belgeler: https://docs.docker.com/compose/environment-variables/
ubuntu bash
? Ubuntu ile oluşturulan resimler için temel resim olarak mı yoksa her resim için mi geçerli?
-e
çağlar öncesindeki argümanlardan sonra konteyner ismini koymakla ilgili biraz okudum ! Bunu neden gerekli hale getirdiklerini anlamaya bile başlayamıyorum ...
Ana makine ortam değişkenlerini bir docker kapsayıcısına nasıl bağlayacağınız güzel bir kesmek var:
env > env_file && docker run --env-file env_file image_name
Çünkü, çok dikkatli bu tekniği kullanın
env > env_file
dökümü TÜM ev sahipliği makinesi ENV değişkenlerienv_file
ve koşu kapta erişilebilir hale.
Amazon AWS ECS / ECR için, ortam değişkenlerinizi ( özellikle sırları ) özel bir S3 grubu aracılığıyla yönetmelisiniz . Amazon S3 ve Docker'ı Kullanarak Amazon EC2 Konteyner Hizmeti Tabanlı Uygulamalar için Sırları Yönetme konusuna bakın .
Ortam değişkenleri env.sh
yerel olarak varsa ve kapsayıcı başladığında ayarlamak istiyorsanız, deneyebilirsiniz
COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]
Bu komut, bir bash kabuğu ( source
bash komutu olduğundan bash kabuğu istiyorum env.sh
) ile kaplamayı başlatır, dosyayı (ortam değişkenlerini ayarlar ) kaynaklar ve jar dosyasını yürütür.
Öyle env.sh
görünüyor,
#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"
printenv
Komutu sadece gerçek kaynak komutunun çalıştığını test etmek için ekledim . Source komutunun iyi çalıştığını veya ortam değişkenlerinin docker günlüklerinizde görüneceğini onayladığınızda, muhtemelen kaldırmanız gerekir.
--env-file
bir arg için bir docker run
komut belirtme seçeneği yoktur . Örneğin, Google uygulama motorunu kullanarak bir uygulama dağıtıyorsanız ve kapsayıcı içinde çalışan uygulama, docker kapsayıcısında ayarlanmış ortam değişkenlerine ihtiyaç duyuyorsa, docker run
komut üzerinde denetiminiz olmadığından ortam değişkenlerini ayarlamak için doğrudan bir yaklaşımınız yoktur. . Böyle bir durumda, say, KMS kullanarak env değişkenlerinin şifresini çözen ve bunları env.sh
env değişkenlerini ayarlamak için kaynaklanabilecek bir komut dosyasına sahip olabilirsiniz.
.
normalde bulunan POSIX (nokta) komutunu kullanabilirsiniz . ( aynıdır )sh
source
source
.
Jv kullanarak env JSON dönüştürmek için:
env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>
bu jq sürüm 1.6 veya daha yenisini gerektirir
bu ana env json olarak, aslında Dockerfile'de olduğu gibi:
ENV HOST_ENV (all env from the host as json)
docker run -e HOST_ENV="$env_as_json" <image>
? : ? Benim durumumda Docker, docker argümanları olarak iletildiğinde değişkenleri veya alt kabukları ( ${}
veya $()
) çözüyor gibi görünmüyor . Örneğin: A=123 docker run --rm -it -e HE="$A" ubuntu
o kabın içinde: root@947c89c79397:/# echo $HE root@947c89c79397:/#
.... HE
Değişken bunu yapmaz.
-e bayrağı ve $ kullanarak makine ortamı değişkenini de barındırabiliriz:
docker run -it -e MG_HOST=$MG_HOST -e MG_USER=$MG_USER -e MG_PASS=$MG_PASS -e MG_AUTH=$MG_AUTH -e MG_DB=$MG_DB -t image_tag_name_and_version
Bu yöntemi kullanarak benim durumumda env değişkenini sizin adınızla otomatik olarak ayarlayın (MG_HOST, MG_USER)
Python kullanıyorsanız, dock içindeki bu ortam değişkenine
import os
host,username,password,auth,database=os.environ.get('MG_HOST'),os.environ.get('MG_USER'),os.environ.get('MG_PASS'),os.environ.get('MG_AUTH'),os.environ.get('MG_DB')
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
İçinde saklanan verileri grep etmenin .env
ve güvenli olmayan bir şekilde saklanmadan Docker'a iletmenin bir yoludur (böylece sadece docker history
anahtarlara bakamazsınız.
Senin gibi bir sürü AWS malzeme var diyelim .env
:
AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
`` docker run --rm -it --env-file <(bash -c 'env | grep AWS_') ile çalışan docker, hepsini kapacak ve konteynerden erişilebilir olması için güvenli bir şekilde geçirecektir.