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:
set -a
source .my-env
docker-compose up -d
Kemudian Anda dapat mereferensikan variabel dalam docker-compose.yml menggunakan $ {VARIABLE}, seperti:
db:
image: "postgres:${POSTGRES_VERSION}"
Dan ini adalah info lebih lanjut dari dokumen, diambil di sini: https://docs.docker.com/compose/compose-file/#variable-substitution
Ketika Anda menjalankan docker-compose dengan konfigurasi ini, Compose mencari variabel lingkungan POSTGRES_VERSION di shell dan mengganti nilainya. Untuk contoh ini, Compose memutuskan gambar untuk postgres: 9.3 sebelum menjalankan konfigurasi.
Jika variabel lingkungan tidak disetel, tulis pengganti dengan string kosong. Pada contoh di atas, jika POSTGRES_VERSION tidak disetel, nilai untuk opsi gambar adalah postgres :.
Sintaks $ VARIABEL dan $ {VARIABEL} didukung. Fitur gaya-shell yang diperluas, seperti $ {VARIABLE-default} dan $ {VARIABLE / foo / bar}, tidak didukung.
Jika Anda perlu memasukkan tanda dolar literal ke dalam nilai konfigurasi, gunakan tanda dolar ganda ($$).
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:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
kemudian jalankan skrip bash ini di direktori yang sama, yang seharusnya menyebarkan semuanya dengan benar:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
Referensi saja variabel env Anda dalam file penulisan Anda dengan sintaks bash yang biasa (yaitu ${SECRET_KEY}
untuk memasukkan SECRET_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}
dengan my-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.