2017-08-08 3 views
0

Da bin Name der App, die ich Container einfüge, ändern kann (docker build ist Teil eines größeren Builds und es ist einfach für mich, den richtigen Namen von einem Build zum anderen zu übergeben) Ich möchte so etwas tun:Dockerfile - evaluiere env-Variable zur Erstellungszeit

ENTRYPOINT ["$PATH_TO_BIN"]

Aber da gibt es keine Schale dies in der Regel zu bewerten fehl. Theoretisch könnte ich für

ENTRYPOINT $PATH_TO_BIN

Aber in diesem Fall gehen kann ich keine Argumente übergeben, wenn run tun.

es irgendwie möglich ist, exec Form zu verwenden und args oder env Variablen während des Build zu bewerten (so gibt es keine Notwendigkeit für Shell zur Laufzeit?)

+0

Mögliche Duplikat von [Können wir ENV-Variablen über die Befehlszeile übergeben, während ein Docker-Image über Dockerfile erstellt wird?] (https://stackoverflow.com/questions/31198835/can-we-pass-env-variables-through-cmd-line-while -Bui lding-a-docker-image-through) – MatTheWhale

Antwort

0

Dieses durchaus möglich. Das Problem ist, dass Sie versuchen, den Befehl direkt auszuführen. Stattdessen müssen Sie eine entrypoint.sh erstellen und ausführen lassen. Dieses Skript kann basierend auf Umgebungsvariablen festlegen, was zu tun ist.

Betrachten Sie die unten Dockerfile

FROM centos:7.2.1511 
COPY entrypoint.sh /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 
CMD ["this","is", "tarun"] 

und den Inhalt des entrypoint.sh sind wie unten

#!/usr/bin/env sh 

_load() { 
    CMD="" 
    if [ ! -z "$ENTRYPOINT" ]; then 
     CMD=$ENTRYPOINT 
    fi 

    if [ "$#" -gt 0 ]; then 
     CMD="$CMD [email protected]" 
    elif [ ! -z $COMMAND ]; then 
     CMD="$CMD $COMMAND" 
    fi 

    echo "Executing - $CMD" 
    exec $CMD 
} 

_load [email protected] 

Das Skript nichts tut, aber überprüfen, ob eine Umgebungsvariable $ENTRYPOINT oder $COMMAND übergeben wurde, oder beide waren vergangen oder Befehl von docker run wurde übergeben. Basierend auf folgenden Prioritätsreihenfolge läuft er den Befehl

  • ENTRYPOINT + RUN PARAMETER - beide Kombinieren und
  • ENTRYPOINT + Befehl ausführen - beide kombinieren und führen
  • FEHLT $ COMMAND - Run $ ENTRYPOINT
  • FEHLT $ ENTRYPOINT - Run $ COMMAND

Jetzt testen es

$ docker run -e ENTRYPOINT=/bin/echo test my name "is XYZ" 
Executing - /bin/echo my name is XYZ 
my name is XYZ 

Das Skript kann nicht zu 100% perfekt sein, aber ich gerade erstellt die Idee

zeigen Wenn Sie ein einfaches entrypoint.sh benötigen, dann können Sie es sogar ersetzen unterhalb dem Inhalt

exec $ENTRYPOINT [email protected] 

Dies würde auch Arbeit.

+0

so viel wird für so wenig benötigt? – korda

+0

Dies ist nur kleine –

+0

@ korda, fügte auch eine einfachere Einstiegspunkt-Version hinzu –

1

Wenn Sie die neueste Version von Docker-Engine verwenden Sie diese in Ihrem Dockerfile hinzufügen:

ARG PATH_TO_BIN 

und dann wie folgt vorgehen:

docker build --build-arg PATH_TO_BIN=/usr/bin/ 

Mehr unter documentation

Verwandte Themen