2016-11-06 24 views
12

:Dockerfile CMD içindeki bir değişkeni nasıl kullanabilirim? Benim Dockerfile İçinde

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

Hata:

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

burada hızlı çözüm nedir? Docker'ın, Docker'ın daha sonraki sürümlerinde bu işlevi "düzeltmesi" veya bu işlevselliği sunması için herhangi bir planı var mı?

NOT: Ben Docker dosyasından CMD satırını kaldırın ve sonra Docker kabı çalıştırırsanız, el konteyner içinden Django-admin startproject $ projectname çalıştırmak mümkün ve o ...

projeyi yaratacak
+1

nasıl ve '$ PROJECTNAME' tanımlıyoruz? –

+0

ENERJİ kullanarak Dockerfile'ımın başında. Ayrıca, CMD hattını Dockerfile'dan kaldırırsam ve kapsayıcıyı kapsayıcının içinden çalıştırırsam bu komutu çalıştırabileceğimi ve projeyi yaratacağını (ENV değişkeninin geçerli olduğunu) söylemeyi unutmuştum. – david

+0

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

cevap

18

nda olduğu gibi bir yürütme listesi kullandığınızda ...

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

... sonra Docker bir kabuk içeren olmadan, verilen komutu doğrudan çalıştırır. ilgili hiçbir kabuk olduğu için, bu şu anlama gelir:

  • Resim değişken genişleme
  • Resim Joker genişletme
  • vb > Resim I/O yönlendirme, <, |,
  • No birden komutları command1; command2
  • ile
  • Ve benzeri.

CMD ürününüzün değişkenleri genişletmesini istiyorsanız, bir kabuk ayarlamanız gerekir.

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

Yoksa size önceki örnekte esas olarak özdeş bir sonuç alır yerine bir yürütme listesinin basit bir dize kullanabilirsiniz: Böyle bunu yapabilir

CMD django-admin startproject $PROJECTNAME 
+0

güncelleştirildi Docker'ın sorun izleyicisi'nde bazı daha fazla okuma: https://github.com/docker/docker/issues/5509 – jannis

+0

"c" sonra virgül yok. – Ako

+0

@ako, Sabit, teşekkürler. – larsks

1

istediğiniz Diyelim ki Bir konteyner içinde bir java süreci başlatmak için. Bu durumda daha fazla seçeneğe ihtiyacınız vardır ve işlemi doğrudan başlatmak istiyorsanız (ör., Tomcat durumunda catalina.sh sarıcı olmadan). Her şeyden önce catalina.sh sarıcı kullanarak işlemi başlatın. Daha sonra kapsayıcının içinde ps ef | less komutunu kullanarak işleminizin yürütme ifadesini alın. Şimdi seçenekleri ve komut bölümünü alt bölümlere ayırın ve bu yeni CMD'niz olacaktır.

Örnek Dockerfile alıntı:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["myprocess", "${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 "[email protected]") 
İlgili konular