2017-06-09 6 views
2

Ich habe ein Dockerfile wie folgt beginnt:

FROM ubuntu:16.04 
WORKDIR /some/path 
COPY . . 
ENV PYTHONUSERBASE=$PWD/pyenv PATH=$PWD/pyenv/bin:$PATH 
RUN echo "PWD is: $PWD" 
RUN echo "PYENV is: $PYTHONUSERBASE" 

fand ich $PWD (oder ${PWD}) wurde nicht festgelegt, wenn ich docker build laufen, wie ein Vergleich, $PATH wurde richtig erweitert

Außerdem $PWD in RUN hat kein Problem (Er druckt /some/path in diesem Fall)

So ist die Ausgabe des gegebenen Dockerfile wäre:

PWD is: /some/path 
PYENV is: /pyenv 

Könnte mir jemand sagen, warum $PWD so besonders ist, ? Ich schätze, es könnte mit dem Verhalten von WORKDIR zusammenhängen, aber ich habe keine Ahnung davon.

Antwort

1

PWD ist eine spezielle Variable, die innerhalb einer Shell gesetzt wird. Wenn docker RUN etwas tut, tut es das mit diesem Formular sh -c 'something' und übergibt die vordefinierten Umgebungsvariablen von ENV Anweisungen, wo PWD nicht in dieser Liste ist (siehe es mit docker inspect <image-id>).

ENV-Anweisungen starten keine Shell. Fügen Sie einfach die aktuelle Liste der env vars in den Bildmetadaten hinzu oder aktualisieren Sie sie.

Ich würde schreiben Sie Ihre Dockerfile wie folgt aus:

FROM ubuntu:16.04 
ENV APP_PATH=/some/path 
WORKDIR $APP_PATH 
COPY . . 
ENV PYTHONUSERBASE=$APP_PATH/pyenv PATH=$APP_PATH/pyenv/bin:$PATH 
RUN echo "PWD is: $PWD" 
RUN echo "PYENV is: $PYTHONUSERBASE" 

Weitere Informationen in docs:

Die WORKDIR Befehl setzt das Arbeitsverzeichnis für jeden RUN, CMD, ENTRYPOINT, COPY und ADD Anweisungen, folge ihm in der Dockerdatei. Wenn das WORKDIR nicht existiert, wird es erstellt, auch wenn es in keiner nachfolgenden Dockerfile-Anweisung verwendet wird.

+0

So Docker legt Arbeitsverzeichnis für jede RUN, CMD, ENTRYPOINT, COPY und ADD Anweisungen, aber nicht ENV, richtig? – cherrot

+0

Ich habe es wieder gelesen. Ich habe die Frage missverstanden. Lass es mich reparieren – Robert

+0

Danke @Robert! – cherrot

Verwandte Themen