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.