Dockerfile CMD içinde bir değişkeni nasıl kullanabilirim?


115

Dockerfile dosyamın içinde:

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

Hata:

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

Buradaki en hızlı çözüm nedir? Docker'ın Docker'ın sonraki sürümlerinde bu işlevselliği "düzeltme" veya sunma planı var mı?

NOT: CMD satırını Docker dosyasından kaldırır ve ardından Docker konteynerini çalıştırırsam, Django-admin startproject $ PROJECTNAME konteynerin içinden manuel olarak çalıştırabilirim ve projeyi oluşturacaktır ...


1
Nasıl ve ne zaman tanımlıyorsunuz $PROJECTNAME?
— Piotr Wittchen

ENV kullanan Dockerfile'ımın başında. Ayrıca CMD satırını Dockerfile'dan kaldırıp daha sonra konteyneri çalıştırırsam, konteynerin içinden bu komutu çalıştırabileceğimi ve projeyi oluşturacağını (yani ENV değişkeninin geçerli olduğunu) söylemeyi unuttum.
— david

Ne tür bir değişkeni kastediyorsunuz: dockerfile değişkeni veya çevresel değişken (sistem çalışma zamanınızda olduğu gibi)?
— emix

Yanıtlar:


175

Bir yürütme listesi kullandığınızda, olduğu gibi ...

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

... daha sonra Docker, verilen komutu bir kabuk dahil etmeden doğrudan çalıştıracaktır . Katılan kabuk olmadığından, bu şu anlama gelir:

  • Değişken genişletme yok
  • Joker karakter genişletmesi yok
  • Resim I / O yönlendirme ile >, <,| , vs
  • Üzerinden birden fazla komut yok command1; command2
  • Ve benzeri.

CMDDeğişkenlerinizi genişletmek istiyorsanız, bir kabuk ayarlamanız gerekir. Bunu şu şekilde yapabilirsiniz:

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

Veya bir yürütme listesi yerine basit bir dize kullanabilirsiniz, bu size önceki örnekle büyük ölçüde aynı sonucu verir:

CMD django-admin startproject $PROJECTNAME

2
Docker sorun izleyicisinde biraz daha okuma: github.com/docker/docker/issues/5509
— jannis

21

Değeri çalışma zamanında kullanmak istiyorsanız, ENVdeğeri Dockerfile. Derleme zamanında kullanmak istiyorsanız, kullanmalısınızARG .

Misal :

ARG value
ENV envValue=$value
CMD ["sh", "-c", "java -jar ${envValue}.jar"]

Değeri inşa komutunda iletin:

docker build -t tagName --build-arg value="jarName"

12

Bir konteyner içinde bir java işlemi başlatmak istediğinizi varsayalım:

Örnek Dockerfile alıntı:

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

Örnek entrypoint.sh alıntı:

#!/bin/sh 
... 
echo "*** Startup $0 suceeded now starting service using eval to expand CMD variables ***"
exec su-exec mytechuser $(eval echo "$@")

0

Yukarıdan ilham alarak şunu yaptım:

#snapshot by default. 1 is release.
ENV isTagAndRelease=0

CMD     echo is_tag: ${isTagAndRelease} && \
        if [ ${isTagAndRelease} -eq 1 ]; then echo "release build"; mvn -B release:clean release:prepare release:perform; fi && \
        if [ ${isTagAndRelease} -ne 1 ]; then echo "snapshot build"; mvn clean install; fi && \ 
       .....
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.