2016-11-06 11 views
12

Wewnątrz mojego Dockerfile:Jak mogę użyć zmiennej wewnątrz pliku CMD Dockerfile?

ENV PROJECTNAME mytestwebsite 
CMD ["django-admin", "startproject", "$PROJECTNAME"] 

Błąd:

CommandError: '$PROJECTNAME' is not a valid project name 

Jaki jest najszybszy obejście tutaj? Czy Docker ma jakiś plan "naprawić" lub wprowadzić tę funkcję w późniejszych wersjach Dockera?

UWAGA: Jeśli usunąć linię z pliku CMD Docker a następnie uruchomić pojemnik Docker, jestem w stanie uruchomić ręcznie Django-admin startproject $ Nazwa_projektu od wewnątrz pojemnika i stworzy projekt ...

+1

Jak i kiedy ty definiowania '$ PROJECTNAME'? –

+0

Na początku mojego pliku Docker za pomocą ENV. Zapomniałem też wspomnieć, że jeśli usunę linię CMD z pliku Dockerfile, a następnie uruchomę kontener, z wnętrza kontenera mogę uruchomić to polecenie i utworzy on projekt (co oznacza, że ​​zmienna ENV jest ważna). – david

+0

Jakiego rodzaju zmienną masz na myśli: zmienną dockerfile lub zmienną środowiskową (tak jak w środowisku uruchomieniowym systemu)? –

Odpowiedz

18

Podczas korzystania z listy wykonania, jak w ...

CMD ["django-admin", "startproject", "$PROJECTNAME"] 

... potem Docker wykona daną komendę bezpośrednio, bez angażowania powłokę. Ponieważ nie ma udział powłoki, to znaczy:

  • ma zmiennej rozszerzenie
  • nr dopasowywanie
  • nr I/O przekierowanie >, <, | itp
  • wielokrotności poleceń przez command1; command2
  • I tak dalej.

Jeśli chcesz, aby CMD rozwijał zmienne, musisz przygotować powłokę. Można to zrobić tak:

CMD ["sh", "-c", "django-admin startproject $PROJECTNAME"] 

Albo można użyć prostego łańcuch zamiast listy wykonanie, które dostaje wynik w dużej mierze identyczne jak w poprzednim przykładzie:

CMD django-admin startproject $PROJECTNAME 
+0

Jeszcze więcej czytania w narzędziu do śledzenia problemów Docker: https://github.com/docker/docker/issues/5509 – jannis

+0

Po "c" brakuje przecinka. – Ako

+0

@ako, dzięki, naprawione. – larsks

1

Powiedzmy chcesz aby rozpocząć proces java wewnątrz kontenera. W takim przypadku potrzebujesz dalszych opcji i chcesz rozpocząć proces bezpośrednio (np. Bez opakowania catalina.sh w przypadku programu tomcat). Przede wszystkim rozpocznij proces przy użyciu opakowania catalina.sh. Następnie wewnątrz kontenera pobierz instrukcję wykonania procesu za pomocą ps ef | less. Podziel teraz sekcję opcji i poleceń, a to będzie Twoja nowa CMD.

Przykład Dockerfile fragment:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["myprocess", "${JAVA_OPTS}", "-myargument=true"] 

Przykład entrypoint.sh fragment:

#!/bin/sh 
... 
echo "*** Startup $0 suceeded now starting service using eval to expand CMD variables ***" 
exec su-exec mytechuser $(eval echo "[email protected]") 
Powiązane problemy