Saya ingin dapat menggunakan variabel env di dalam docker-compose.yml, dengan nilai yang diteruskan pada saat docker-compose up. Ini adalah contohnya. Saya melakukan ini hari ini dengan perintah run docker dasar, yang melilit skrip saya sendiri. Apakah ada cara untuk mencapainya dengan menulis, tanpa bungkus bash seperti itu?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Dmitry z
sumber
sumber
Jawaban:
template.yml
, yang merupakandocker-compose.yml
variabel lingkungan Anda.File baru
docker-compose.yml
akan dihasilkan dengan nilai variabel lingkungan yang benar.Contoh file template.yml:
Contoh file env.sh:
sumber
Solusi DOCKER:
Sepertinya docker-compose 1.5+ telah mengaktifkan substitusi variabel: https://github.com/docker/compose/releases
Susunan Docker terbaru memungkinkan Anda untuk mengakses variabel lingkungan dari file penulisan Anda. Jadi Anda dapat sumber variabel lingkungan Anda, lalu jalankan Tulis seperti ini:
Kemudian Anda dapat mereferensikan variabel dalam docker-compose.yml menggunakan $ {VARIABLE}, seperti:
Dan ini adalah info lebih lanjut dari dokumen, diambil di sini: https://docs.docker.com/compose/compose-file/#variable-substitution
Dan saya yakin fitur ini ditambahkan dalam permintaan tarik ini: https://github.com/docker/compose/pull/1765
Solusi BASH:
Saya perhatikan ada masalah dengan dukungan variabel lingkungan Docker. Daripada berurusan dengan variabel lingkungan di Docker, mari kembali ke dasar-dasar, seperti bash! Berikut adalah metode yang lebih fleksibel menggunakan skrip bash dan a
.env
file.Contoh file .env:
kemudian jalankan skrip bash ini di direktori yang sama, yang seharusnya menyebarkan semuanya dengan benar:
Referensi saja variabel env Anda dalam file penulisan Anda dengan sintaks bash yang biasa (yaitu
${SECRET_KEY}
untuk memasukkanSECRET_KEY
dari.env
file).Catatan
COMPOSE_CONFIG
didefinisikan dalam.env
file saya dan digunakan dalam skrip bash saya, tetapi Anda dapat dengan mudah hanya mengganti{$COMPOSE_CONFIG}
denganmy-compose-file.yml
skrip bash di.Perhatikan juga bahwa saya memberi label penyebaran ini dengan memberi nama semua kontainer saya dengan awalan "myproject". Anda dapat menggunakan nama apa pun yang Anda inginkan, tetapi itu membantu mengidentifikasi wadah Anda sehingga Anda dapat dengan mudah merujuknya nanti. Dengan asumsi bahwa kontainer Anda tidak memiliki kewarganegaraan, sebagaimana mestinya, skrip ini akan dengan cepat menghapus dan mempekerjakan kembali kontainer Anda sesuai dengan param file .env Anda dan file YAML penulisan Anda.
Pembaruan Karena jawaban ini tampaknya cukup populer, saya menulis posting blog yang menjelaskan alur kerja penempatan Docker saya secara lebih mendalam: http://lukeswart.net/2016/03/lets-deploy-part-1/ Ini mungkin berguna ketika Anda menambahkan lebih rumit untuk konfigurasi penggunaan, seperti konfigurasi nginx, sertifikat LetsEncrypt, dan kontainer yang ditautkan.
sumber
grep foo file.text
sajacat file.text | grep foo
. Dalam kasus saya, saya harusexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
dan tidak dengandocker-compose run
..env
bawahenv_file
. Kemudian Anda dapat referensi variabel dalamdocker-compose.yml
menggunakan${VARIABLE}
Tampaknya docker-compose memiliki dukungan asli sekarang untuk variabel lingkungan default dalam file .
yang perlu Anda lakukan adalah mendeklarasikan variabel Anda dalam file yang bernama
.env
dan mereka akan tersedia di docker-compose.yml.Misalnya, untuk
.env
file dengan konten:Anda bisa mengakses variabel Anda di dalam
docker-compose.yml
atau meneruskannya ke wadah:sumber
.env
, misalnyaconfig.env
tidak berfungsi untuk saya.Hal berikut ini berlaku untuk komposisi galangan 3.x Set variabel lingkungan di dalam wadah
Buat file .env di lokasi yang sama dengan docker-compose.yml
dan file menulis Anda akan seperti
sumber
sumber
Saat menggunakan variabel lingkungan untuk volume yang Anda butuhkan:
buat file .env di folder yang sama yang berisi
docker-compose.yaml
filemendeklarasikan variabel dalam
.env
file:Ubah
$hostname
ke${HOSTNAME}
padadocker-compose.yaml
fileTentu saja Anda dapat melakukannya secara dinamis pada setiap bangunan seperti:
sumber
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
Cara terbaik adalah menentukan variabel lingkungan di luar
docker-compose.yml
file. Kamu bisa memakaienv_file
pengaturan, dan menentukan file lingkungan Anda dalam baris yang sama. Kemudian melakukan penyusunan kembali buruh pelabuhan harus membuat ulang wadah dengan variabel lingkungan baru.Begini tampilannya seperti docker-compose.yml:
sumber
Anda belum bisa ... Tapi ini alternatifnya, pikirkan generator generator docker-composer.yml:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
Pada dasarnya skrip shell yang akan menggantikan variabel Anda. Anda juga dapat menggunakan tugas Grunt untuk membangun file komposisi buruh pelabuhan Anda di akhir proses CI Anda.
sumber
Saya punya skrip bash sederhana yang saya buat untuk ini, artinya menjalankannya di file Anda sebelum digunakan: https://github.com/antonosmond/subber
Pada dasarnya hanya buat file penulisan Anda menggunakan kurung kurawal ganda untuk menunjukkan variabel lingkungan mis:
Apa pun dalam kurung kurawal ganda akan diganti dengan variabel lingkungan dengan nama yang sama jadi jika saya menetapkan variabel lingkungan berikut:
menjalankan
subber docker-compose.yml
file yang dihasilkan akan terlihat seperti:sumber
Sejauh yang saya tahu, ini adalah pekerjaan dalam proses. Mereka ingin melakukannya, tetapi belum dirilis. Lihat 1377 ("baru" 495 yang disebutkan oleh @Andy).
Saya akhirnya menerapkan pendekatan "generate .yml sebagai bagian dari CI" seperti yang diusulkan oleh @Thomas.
sumber
tambahkan env ke file .env
Seperti
lalu simpan ke
deploy.sh
sumber
Gunakan file .env untuk menentukan nilai dinamis di docker-compse.yml. Baik itu port atau nilai lainnya.
Contoh komposisi buruh pelabuhan:
Di dalam file .env Anda dapat menentukan nilai variabel-variabel ini:
sumber
Gunakan versi 3.6:
Saya mendapatkannya dari tautan ini https://github.com/docker/cli/issues/939
sumber
Sejak 1.25.4, komposisi buruh pelabuhan mendukung opsi
--env-file
yang memungkinkan Anda menentukan file yang berisi variabel.Milik Anda akan terlihat seperti ini:
Dan perintahnya:
sumber