Jawaban:
Anda dapat mengirimkan variabel lingkungan ke wadah Anda dengan -ebendera.
Contoh dari skrip startup:
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
Atau, jika Anda tidak ingin memiliki nilai pada baris perintah di mana itu akan ditampilkan oleh ps, dll., -eDapat menarik nilai dari lingkungan saat ini jika Anda hanya memberikannya tanpa =:
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
Jika Anda memiliki banyak variabel lingkungan dan terutama jika itu dimaksudkan untuk dirahasiakan, Anda dapat menggunakan file env :
$ docker run --env-file ./env.list ubuntu bash
Bendera --env-file mengambil nama file sebagai argumen dan mengharapkan setiap baris dalam format VAR = VAL, meniru argumen yang diteruskan ke --env. Baris komentar hanya perlu diawali dengan #
export PASSWORD=foosebaliknya dan variabel akan diteruskan ke docker runsebagai variabel lingkungan, membuat docker run -e PASSWORDpekerjaan.
Anda dapat meneruskan menggunakan -eparameter dengan docker run ..perintah seperti yang disebutkan di sini dan seperti yang disebutkan oleh @errata.
Namun, kemungkinan kelemahan dari pendekatan ini adalah kredensial Anda akan ditampilkan dalam daftar proses, tempat Anda menjalankannya.
Untuk membuatnya lebih aman, Anda dapat menulis kredensial Anda dalam file konfigurasi dan melakukannya docker rundengan yang --env-filedisebutkan di sini . Kemudian Anda dapat mengontrol akses file konfigurasi itu sehingga orang lain yang memiliki akses ke mesin itu tidak akan melihat kredensial Anda.
--env-file, ketika Anda menggunakan --envnilai-nilai ENV Anda akan dikutip / lolos dengan semantik standar dari shell apa pun yang Anda gunakan, tetapi ketika menggunakan --env-filenilai-nilai Anda akan masuk ke dalam wadah Anda akan berbeda. Perintah run docker hanya membaca file, melakukan parsing yang sangat mendasar dan meneruskan nilai-nilai ke wadah, itu tidak setara dengan cara shell Anda berperilaku. Hanya sedikit saja yang perlu diperhatikan jika Anda mengonversi banyak --enventri menjadi --env-file.
Jika Anda menggunakan 'docker-compose' sebagai metode untuk memutar wadah Anda, sebenarnya ada cara yang berguna untuk meneruskan variabel lingkungan yang ditentukan pada server Anda ke wadah Docker.
Dalam docker-compose.ymlfile Anda , katakanlah Anda memutar wadah hapi-js dasar dan kode tersebut terlihat seperti:
hapi_server:
container_name: hapi_server
image: node_image
expose:
- "3000"
Katakanlah server lokal tempat proyek buruh pelabuhan Anda memiliki variabel lingkungan bernama 'NODE_DB_CONNECT' yang ingin Anda sampaikan ke wadah hapi-js Anda, dan Anda ingin nama barunya menjadi 'HAPI_DB_CONNECT'. Kemudian dalam docker-compose.ymlfile, Anda akan meneruskan variabel lingkungan lokal ke wadah dan menamainya seperti:
hapi_server:
container_name: hapi_server
image: node_image
environment:
- HAPI_DB_CONNECT=${NODE_DB_CONNECT}
expose:
- "3000"
Saya harap ini membantu Anda untuk menghindari pengkodean keras string koneksi database dalam file apa pun di wadah Anda!
Dengan menggunakan docker-compose, Anda dapat mewarisi variabel env di docker-compose.yml dan selanjutnya setiap Dockerfile dipanggil oleh docker-composeuntuk membuat gambar. Ini berguna ketika Dockerfile RUNperintah harus menjalankan perintah khusus untuk lingkungan.
(shell Anda RAILS_ENV=developmentsudah ada di lingkungan)
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
Dengan cara ini saya tidak perlu menentukan variabel lingkungan dalam file atau docker-compose build/ upperintah:
docker-compose build
docker-compose up
Gunakan -eatau --env value untuk mengatur variabel lingkungan (default []).
Contoh dari skrip startup:
docker run -e myhost='localhost' -it busybox sh
Jika Anda ingin menggunakan beberapa lingkungan dari baris perintah maka sebelum setiap variabel lingkungan menggunakan -ebendera.
Contoh:
sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh
Catatan: Pastikan meletakkan nama wadah setelah variabel lingkungan, bukan sebelum itu.
Jika Anda perlu mengatur banyak variabel, gunakan --env-fileflag
Sebagai contoh,
$ docker run --env-file ./my_env ubuntu bash
Untuk bantuan lain, lihat bantuan Docker:
$ docker run --help
Dokumentasi resmi: https://docs.docker.com/compose/environment-variables/
ubuntu bash ? Apakah ini berlaku untuk gambar yang dibuat dengan ubuntu sebagai gambar dasar atau untuk setiap gambar?
-eargumen yang lalu! Saya bahkan tidak bisa mulai mengerti mengapa mereka membuat ini perlu ...
Ada cara yang bagus untuk mem-pipe variabel lingkungan mesin host ke wadah buruh pelabuhan:
env > env_file && docker run --env-file env_file image_name
Gunakan teknik ini dengan sangat hati-hati, karena
env > env_fileakan membuang semua variabel mesin host ENV keenv_filedan membuatnya dapat diakses dalam wadah yang sedang berjalan.
Untuk Amazon AWS ECS / ECR, Anda harus mengelola variabel lingkungan Anda ( terutama rahasia ) melalui ember S3 pribadi. Lihat posting blog Cara Mengelola Rahasia untuk Amazon EC2 Aplikasi Berbasis Layanan Kontainer dengan Menggunakan Amazon S3 dan Docker .
Jika Anda memiliki variabel lingkungan di env.shlokal dan ingin mengaturnya ketika wadah dimulai, Anda bisa mencoba
COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]
Perintah ini akan memulai wadah dengan bash shell (saya ingin bash shell karena sourcemerupakan perintah bash), sumber env.shfile (yang menetapkan variabel lingkungan) dan mengeksekusi file jar.
The env.shterlihat seperti ini,
#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"
Saya menambahkan printenvperintah hanya untuk menguji apakah perintah sumber yang sebenarnya berfungsi. Anda mungkin harus menghapusnya ketika Anda mengkonfirmasi perintah sumber berfungsi dengan baik atau variabel lingkungan akan muncul di log buruh pelabuhan Anda.
--env-filearg ke docker runperintah. Misalnya, jika Anda menggunakan aplikasi menggunakan mesin aplikasi Google dan aplikasi yang berjalan di dalam wadah membutuhkan variabel lingkungan yang ditetapkan di dalam wadah buruh pelabuhan, Anda tidak memiliki pendekatan langsung untuk mengatur variabel lingkungan karena Anda tidak memiliki kendali atas docker runperintah . Dalam kasus seperti itu, Anda bisa memiliki skrip yang mendekripsi variabel env menggunakan say, KMS, dan menambahkannya ke env.shyang dapat diambil dari sumber untuk mengatur variabel env.
.(dot) yang tersedia secara teratur shalih-alih source. ( sourceSama seperti .)
Menggunakan jq untuk mengonversi env ke JSON:
env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>
ini membutuhkan versi jq 1.6 atau lebih baru
ini pust host env sebagai json, pada dasarnya seperti di Dockerfile:
ENV HOST_ENV (all env from the host as json)
docker run -e HOST_ENV="$env_as_json" <image>? : ? Dalam kasus saya Docker tampaknya tidak menyelesaikan variabel atau subshell ( ${}atau $()) ketika dilewatkan sebagai docker args. Misalnya: A=123 docker run --rm -it -e HE="$A" ubuntulalu di dalam wadah itu: root@947c89c79397:/# echo $HE root@947c89c79397:/# .... HEVariabel tidak berhasil.
kami juga dapat meng-host variabel lingkungan mesin menggunakan -e flag dan $:
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
Dengan menggunakan metode ini, atur variabel env secara otomatis dengan nama yang Anda berikan dalam kasus saya (MG_HOST, MG_USER)
Jika Anda menggunakan python, Anda dapat mengakses variabel envment ini di dalam docker dengan
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>')
Adalah cara untuk mengambil data yang disimpan di dalam .envdan meneruskannya ke Docker, tanpa ada yang disimpan secara tidak aman (jadi Anda tidak bisa hanya melihat docker historydan mengambil kunci.
Katakanlah Anda memiliki banyak barang AWS di .envseperti Anda :
AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
menjalankan buruh pelabuhan dengan `` `buruh pelabuhan menjalankan --rm -it --env-file <(bash -c 'env | grep AWS_') akan mengambil semuanya dan meneruskannya dengan aman agar dapat diakses dari dalam wadah.