Użyj zmiennych środowiskowych w CMD

84

Czy mogę używać zmiennych środowiskowych w sekcji CMD w pliku Dockerfile?

Chcę zrobić coś takiego:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]

Gdzie $ MEMCACHE_11211_TCP_ * zostałby ustawiony automatycznie przez włączenie parametru --link do mojego docker runpolecenia. A $ ARG byłby konfigurowalny przez użytkownika w czasie wykonywania, być może przez parametr „-e”?

Wydaje się, że to nie działa dla mnie, wydaje się, że dosłownie przechodzi przez ciąg „$ ARG”, na przykład.

brooks94
źródło

Odpowiedzi:

59

Ta odpowiedź może być trochę spóźniona. Ale środowisko dla CMDjest interpretowane nieco inaczej w zależności od tego, jak napiszesz argumenty. Jeśli przekażesz CMDciąg jako łańcuch (nie wewnątrz tablicy), zostanie on uruchomiony jako powłoka zamiast exec. Zobacz https://docs.docker.com/engine/reference/builder/#cmd .

Możesz wypróbować CMDbez składni tablicy, aby uruchomić jako powłokę:

CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT
Andy Shinn
źródło
28
CMD ["sh", "-c", "echo ${MY_HOME}"]

Odpowiedź od sffits tutaj .

Alex Punnen
źródło
11

Obaj Andys mieli rację. Składnia json pomija punkt wejścia. Kiedy używasz CMD, jak w ich przykładzie, jest on traktowany jako argument domyślnego punktu wejścia: /bin/sh -cktóry zinterpretuje zmienne środowiskowe.

Docker nie ocenia zmiennych w CMD w żadnym przypadku. W pierwszym przypadku polecenie jest wywoływane bezpośrednio, więc nic nie jest interpretowane, w drugim zmienne są interpretowane przez sh.

trzeszczenie
źródło
7

Nie mogę mówić, jak to powinno działać, ale myślę, że gdybyś nazwał to np. Skryptem powłoki CMD runmyserver.sh, to interpretacja zmiennych powłoki byłaby odroczona do czasu rzeczywistego uruchomienia CMD.

Więc spróbuj

myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 

jako skrypt powłoki?

Andy
źródło