Chciałbym móc używać zmiennych env wewnątrz docker-compose.yml, z wartościami przekazywanymi w momencie dokowania-komponowania. To jest przykład. Robię to dzisiaj za pomocą podstawowej komendy uruchamiania dokera, która jest owinięta wokół mojego skryptu. Czy istnieje sposób, aby to osiągnąć za pomocą komponowania bez takich bashów?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Dmitry z
źródło
źródło
Odpowiedzi:
template.yml
, która jest twojadocker-compose.yml
.Nowy plik
docker-compose.yml
zostanie wygenerowany z poprawnymi wartościami zmiennych środowiskowych.Przykładowy plik template.yml:
Przykładowy plik env.sh:
źródło
Rozwiązanie DOCKER:
Wygląda na to, że docker-compose 1.5+ ma włączone podstawianie zmiennych: https://github.com/docker/compose/releases
Najnowsza wersja Docker Compose umożliwia dostęp do zmiennych środowiskowych z pliku tworzenia. Możesz więc zdobyć swoje zmienne środowiskowe, a następnie uruchomić Compose w następujący sposób:
Następnie możesz odwoływać się do zmiennych w docker-compose.yml za pomocą $ {VARIABLE}, w następujący sposób:
A oto więcej informacji z dokumentów, pobranych tutaj: https://docs.docker.com/compose/compose-file/#variable-substitution
I uważam, że ta funkcja została dodana w tym żądaniu ściągnięcia: https://github.com/docker/compose/pull/1765
Rozwiązanie BASH:
Zauważyłem, że ludzie mają problemy z obsługą zmiennych środowiskowych Dockera. Zamiast zajmować się zmiennymi środowiskowymi w Dockerze, wróćmy do podstaw, takich jak bash! Oto bardziej elastyczna metoda wykorzystująca skrypt bash i
.env
plik.Przykładowy plik .env:
następnie uruchom ten skrypt bash w tym samym katalogu, który powinien wszystko poprawnie wdrożyć:
Po prostu odwołaj się do zmiennych env w pliku tworzenia ze zwykłą składnią bash (tj.
${SECRET_KEY}
Aby wstawić plikSECRET_KEY
z.env
pliku).Zauważ, że
COMPOSE_CONFIG
jest zdefiniowany w moim.env
pliku i używany w moim skrypcie bash, ale możesz łatwo zastąpić{$COMPOSE_CONFIG}
gomy-compose-file.yml
w skrypcie bash.Zauważ też, że opisałem to wdrożenie, nazywając wszystkie moje kontenery przedrostkiem „myproject”. Możesz użyć dowolnej nazwy, ale pomaga to zidentyfikować pojemniki, dzięki czemu możesz łatwo do nich później sięgnąć. Zakładając, że twoje kontenery są bezstanowe, tak jak powinny, ten skrypt szybko usunie i ponownie wdroży twoje kontenery zgodnie z parametrami pliku .env i twoim plikiem YAML.
Aktualizacja Ponieważ ta odpowiedź wydaje się dość popularna, napisałem post na blogu, który bardziej szczegółowo opisuje mój przepływ pracy wdrażania Dockera: http://lukeswart.net/2016/03/lets-deploy-part-1/ Może to być pomocne, gdy dodasz bardziej złożona konfiguracja wdrożenia, taka jak konfiguracje nginx, certyfikaty LetsEncrypt i połączone kontenery.
źródło
grep foo file.text
zamiastcat file.text | grep foo
. W moim przypadku musiałemexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
to tylko z, a nie zdocker-compose run
..env
niedostatecznieenv_file
. Następnie możesz odwołać się do zmiennych wdocker-compose.yml
użyciu${VARIABLE}
Wygląda na to, że docker-compose ma teraz natywne wsparcie dla domyślnych zmiennych środowiskowych w pliku .
wszystko, co musisz zrobić, to zadeklarować zmienne w pliku o nazwie,
.env
a będą one dostępne w docker-compose.yml.Na przykład dla
.env
pliku z zawartością:Możesz uzyskać dostęp do zmiennej wewnątrz
docker-compose.yml
lub przekazać ją do kontenera:źródło
.env
, na przykładconfig.env
nie działała dla mnie.Poniższe zasady dotyczą kompilowania dokerów 3.x Ustaw zmienne środowiskowe w kontenerze
Utwórz plik .env w tej samej lokalizacji, co plik docker-compose.yml
a Twój plik tworzenia będzie podobny
źródło
źródło
Podczas korzystania ze zmiennych środowiskowych dla woluminów potrzebujesz:
utwórz plik .env w tym samym folderze, który zawiera
docker-compose.yaml
plikzadeklaruj zmienną w
.env
pliku:Zmień
$hostname
na${HOSTNAME}
wdocker-compose.yaml
plikuOczywiście możesz to zrobić dynamicznie na każdej kompilacji, np .:
źródło
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
Najlepszym sposobem jest określenie zmiennych środowiskowych poza
docker-compose.yml
plikiem. Możesz użyćenv_file
ustawienia i zdefiniować plik środowiska w tym samym wierszu. Następnie ponowne skomponowanie dokera powinno ponownie utworzyć kontenery z nowymi zmiennymi środowiskowymi.Oto jak wygląda mój docker-compose.yml:
źródło
Nie możesz ... jeszcze. Ale jest to alternatywa, pomyśl jak generator docker-composer.yml:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
Zasadniczo skrypt powłoki, który zastąpi twoje zmienne. Możesz także użyć zadania Grunt, aby skompilować plik redakcji dokera na końcu procesu CI.
źródło
Mam prosty skrypt bash, który dla tego stworzyłem, oznacza to po prostu uruchomienie go w pliku przed użyciem: https://github.com/antonosmond/subber
Zasadniczo wystarczy utworzyć plik tworzenia przy użyciu podwójnych nawiasów klamrowych, aby wskazać zmienne środowiskowe, np .:
Wszystko w podwójnych nawiasach klamrowych zostanie zastąpione zmienną środowiskową o tej samej nazwie, więc gdybym miał ustawione następujące zmienne środowiskowe:
po uruchomieniu
subber docker-compose.yml
wynikowy plik wyglądałby następująco:źródło
O ile mi wiadomo, jest to praca w toku. Chcą to zrobić, ale nie zostało jeszcze wydane. Zobacz 1377 („nowy” 495 wspomniany przez @Andy).
W końcu wdrożyłem podejście „generuj .yml jako część CI” zaproponowane przez @Thomas.
źródło
dodaj env do pliku .env
Jak na przykład
następnie zapisz to w
deploy.sh
źródło
Użyj pliku .env, aby zdefiniować wartości dynamiczne w docker-compse.yml. Może to być port lub inna wartość.
Przykładowa kompozycja dokowania:
Wewnątrz pliku .env możesz zdefiniować wartość tych zmiennych:
źródło
Użyj wersji 3.6:
Mam go z tego linku https://github.com/docker/cli/issues/939
źródło
Od wersji 1.25.4 funkcja docker-compose obsługuje opcję
--env-file
umożliwiającą określenie pliku zawierającego zmienne.Twój powinien wyglądać tak:
I polecenie:
źródło