Saya baru mengenal Docker, dan tidak jelas cara mengakses database eksternal dari sebuah wadah. Apakah cara terbaik untuk kode-keras dalam string koneksi?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
sumber
Saya baru mengenal Docker, dan tidak jelas cara mengakses database eksternal dari sebuah wadah. Apakah cara terbaik untuk kode-keras dalam string koneksi?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
Anda dapat mengirimkan variabel lingkungan ke wadah Anda dengan -e
bendera.
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., -e
Dapat 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=foo
sebaliknya dan variabel akan diteruskan kedocker run
sebagai variabel lingkungan, membuatdocker run -e PASSWORD
pekerjaan.Anda dapat meneruskan menggunakan
-e
parameter dengandocker 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 run
dengan yang--env-file
disebutkan di sini . Kemudian Anda dapat mengontrol akses file konfigurasi itu sehingga orang lain yang memiliki akses ke mesin itu tidak akan melihat kredensial Anda.sumber
--env-file
, ketika Anda menggunakan--env
nilai-nilai ENV Anda akan dikutip / lolos dengan semantik standar dari shell apa pun yang Anda gunakan, tetapi ketika menggunakan--env-file
nilai-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--env
entri 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.yml
file Anda , katakanlah Anda memutar wadah hapi-js dasar dan kode tersebut terlihat seperti: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.yml
file, Anda akan meneruskan variabel lingkungan lokal ke wadah dan menamainya seperti:Saya harap ini membantu Anda untuk menghindari pengkodean keras string koneksi database dalam file apa pun di wadah Anda!
sumber
Dengan menggunakan
docker-compose
, Anda dapat mewarisi variabel env di docker-compose.yml dan selanjutnya setiap Dockerfile dipanggil olehdocker-compose
untuk membuat gambar. Ini berguna ketikaDockerfile
RUN
perintah harus menjalankan perintah khusus untuk lingkungan.(shell Anda
RAILS_ENV=development
sudah ada di lingkungan)docker-compose.yml :
Dockerfile :
Dengan cara ini saya tidak perlu menentukan variabel lingkungan dalam file atau
docker-compose
build
/up
perintah:sumber
Gunakan
-e
atau --env value untuk mengatur variabel lingkungan (default []).Contoh dari skrip startup:
Jika Anda ingin menggunakan beberapa lingkungan dari baris perintah maka sebelum setiap variabel lingkungan menggunakan
-e
bendera.Contoh:
Jika Anda perlu mengatur banyak variabel, gunakan
--env-file
flagSebagai contoh,
Untuk bantuan lain, lihat bantuan Docker:
Dokumentasi resmi: https://docs.docker.com/compose/environment-variables/
sumber
ubuntu bash
? Apakah ini berlaku untuk gambar yang dibuat dengan ubuntu sebagai gambar dasar atau untuk setiap gambar?-e
argumen 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:
sumber
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 .
sumber
Cara lain adalah dengan menggunakan kekuatan
/usr/bin/env
:sumber
Jika Anda memiliki variabel lingkungan di
env.sh
lokal dan ingin mengaturnya ketika wadah dimulai, Anda bisa mencobaPerintah ini akan memulai wadah dengan bash shell (saya ingin bash shell karena
source
merupakan perintah bash), sumberenv.sh
file (yang menetapkan variabel lingkungan) dan mengeksekusi file jar.The
env.sh
terlihat seperti ini,Saya menambahkan
printenv
perintah 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.sumber
--env-file
arg kedocker run
perintah. 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 atasdocker run
perintah . Dalam kasus seperti itu, Anda bisa memiliki skrip yang mendekripsi variabel env menggunakan say, KMS, dan menambahkannya keenv.sh
yang dapat diambil dari sumber untuk mengatur variabel env..
(dot) yang tersedia secara teratursh
alih-alihsource
. (source
Sama seperti.
)Menggunakan jq untuk mengonversi env ke JSON:
ini membutuhkan versi jq 1.6 atau lebih baru
ini pust host env sebagai json, pada dasarnya seperti di Dockerfile:
sumber
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" ubuntu
lalu di dalam wadah itu:root@947c89c79397:/# echo $HE root@947c89c79397:/#
....HE
Variabel tidak berhasil.kami juga dapat meng-host variabel lingkungan mesin menggunakan -e flag dan $:
Sebelum berjalan perlu mengekspor (berarti mengatur) variabel dan file env lokal atau sebelum menggunakan
Dengan menggunakan metode ini, atur variabel env secara otomatis dengan nama yang Anda berikan dalam kasus saya (MG_HOST, MG_USER)
Tambahan:
Jika Anda menggunakan python, Anda dapat mengakses variabel envment ini di dalam docker dengan
sumber
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
Adalah cara untuk mengambil data yang disimpan di dalam.env
dan meneruskannya ke Docker, tanpa ada yang disimpan secara tidak aman (jadi Anda tidak bisa hanya melihatdocker history
dan mengambil kunci.Katakanlah Anda memiliki banyak barang AWS di
.env
seperti Anda :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.
sumber