2015-01-07 20 views
35

Jeśli mam kontener dokera, który zacząłem od dawna, jaki jest najlepszy sposób ustawienia zmiennej środowiskowej w uruchomionym kontenerze? Ustawiłem zmienną środowiskową początkowo po uruchomieniu polecenia run.Jak ustawić zmienną środowiskową w uruchomionym kontenerze dokowania?

$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress 

ale teraz, że został uruchomiony przez jakiś czas chcę dodać kolejny VIRTUAL_HOST do zmiennej środowiskowej. Nie chcę usuwać kontenera, a następnie ponownie uruchomić go przy użyciu wymaganej zmiennej środowiskowej, ponieważ wtedy musiałbym migrować stare woluminy do nowego kontenera, ma on pliki tematyczne i ładuje do niego pliki, których ja nie chcesz stracić.

Chciałbym tylko zmienić wartość zmiennej środowiskowej VIRTUAL_HOST.

+0

nie jest możliwe, aby zmienić zmienne środowiskowe uruchomionego procesu, z wyjątkiem samego procesu. To może być (być) być możliwe poprzez umożliwienie aktualizacji zmiennej środowiskowej config (poprzez 'aktualizację dockera), a następnie ponowne uruchomienie kontenera. – cpuguy83

Odpowiedz

10

Docker nie oferuje tej funkcji.

Nie

jest problem: „How to set an enviroment variable on an existing container? #8838

Również z „Allow docker start to take environment variables #7561”:

Teraz Docker nie może zmienić konfigurację kontenera po jego utworzeniu i ogólnie jest OK, ponieważ Tworzenie nowego kontenera jest trywialne.

+0

Ahh, to jest do bani. Wymyślę sposób. Tworzenie nowego kontenera jest trywialne, ale nie jest łatwo pobrać woluminy ze starego kontenera i zamontować je do nowego kontenera. Nie chcę stracić mojego katalogu zawartości wp. Naprawdę nie jest tak trudno ręcznie przesuwać woluminy, ale staram się zautomatyzować rzeczy, aby w pewien sposób zniweczyć cel. Może mógłbym napisać funkcję Pythona, która to robi. https://gist.github.com/anonymous/68f4138261fdb73a6e79 –

+1

Czy możesz użyć oddzielnego kontenera danych i 'volume-from'? – Bryan

22

Istnieje generaly dwie opcje, ponieważ doker nie obsługuje tej funkcji teraz:

  1. Stwórz swój własny skrypt, który będzie działał jak biegacz dla komendy. Na przykład:

    #!/bin/bash 
    export VAR1=VAL1 
    export VAR2=VAL2 
    your_cmd 
    
  2. Uruchom komendę następujący sposób:

    docker exec -i CONTAINER_ID /bin/bash -c "export VAR1=VAL1 && export VAR2=VAL2 && your_cmd" 
    
+0

Teraz, gdy minęło już około 2,5 roku, czy nadal jest to najlepszy sposób robienia rzeczy lub czy funkcja dokowania pozwala na bardziej bezpośrednie podejście? –

4

dla nieco wąskie przypadku użycia, docker issue 8838 wspomina ten sort-of-Hack:

ty po prostu zatrzymaj demona dockera i zmień konfigurację kontenera w /var/lib/docker/containers/[container-id]/config.json (sic)

To rozwiązanie aktualizuje zmienne środowiskowe bez konieczności usuwania i ponownego uruchamiania kontenera, konieczności migracji woluminów i zapamiętywania parametrów do run.

Jednak wymaga to ponownego uruchomienia demona docker. I dopóki nie zostanie rozwiązany problem issue 2658, obejmuje to ponowne uruchomienie wszystkich kontenerów.

1

Napisałeś, że nie chcesz migrować starych tomów. Zakładam więc, że Dockerfile, który został użyty do zbudowania obrazu spencercooley/wordpress, ma zdefiniowaną wartość VOLUME lub zostały określone w wierszu poleceń z przełącznikiem -v.

Można po prostu rozpocząć nowy pojemnik, który importuje woluminy ze starego jednego z --volumes-from switch odczuwalna:

$ docker run --name my-new-wordpress --volumes-from my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpres 

więc trzeba będzie nowego pojemnika, ale nie tracą stare dane. Nie musisz nawet jej dotykać ani migrować.

Dobrze zrobiony pojemnik to zawsze bezpaństwowiec. Oznacza to, że jego proces ma dodawać lub modyfikować tylko pliki na zdefiniowanych woluminach. Można to sprawdzić za pomocą prostego docker diff <containerId> po pewnym czasie działania kontenera.

W takim przypadku nie jest niebezpieczne, gdy ponownie tworzysz kontener z tymi samymi parametrami (w twoim przypadku lekko zmodyfikowanymi). Zakładając, że tworzysz go z dokładnie tego samego obrazu, z którego został utworzony stary i ponownie używasz tych samych wolumenów z wyżej wymienionym przełącznikiem.

Po pomyślnym rozpoczęciu nowego kontenera i sprawdzeniu, czy wszystko działa poprawnie, można usunąć stary kontener wordpress. Stare woluminy są następnie odsyłane z nowego kontenera i nie będą usuwane.

1

Po pierwsze, możesz ustawić env wewnątrz kontenera w taki sam sposób jak w przypadku Linux-a.

Po drugie, możesz to zrobić, modyfikując plik konfiguracyjny swojego kontenera w doku (/var/lib/docker/containers/xxxx/config.v2.json). Uwaga: aby mieć wpływ, potrzebujesz ponownie uruchomić usługę dokowania. W ten sposób można zmienić niektóre inne rzeczy jak mapowanie portów itp

1

Do:

  1. skonfigurować wiele env. vars w jednym kroku,
  2. zapobiec wystawiając je w historii 'sh', jak w przypadku opcji '-e' (przechodząc tokeny uwierzytelniające/API!),

można użyć

- key_value_file.txt env-file

opcja:

docker run --env-file key_value_file.txt $INSTANCE_ID 
Powiązane problemy