408 Stimmen

Change-Verzeichnis-Befehl in Docker?

In Docker möchte ich das tun:

git clone XYZ
cd XYZ
make XYZ

Aber da es keinen `cd` Befehl gibt, muss ich jedes Mal den vollständigen Pfad angeben (make XYZ /vollständigerPfad). Gibt es gute Lösungen dafür?

829voto

Javier Castellanos Punkte 8728

Um in ein anderes Verzeichnis zu wechseln, verwenden Sie WORKDIR. Alle RUN-, CMD- und ENTRYPOINT-Befehle nach WORKDIR werden aus diesem Verzeichnis ausgeführt.

RUN git clone XYZ 
WORKDIR "/XYZ"
RUN make

252voto

Alister Bulman Punkte 33148

Sie können ein Skript ausführen oder einen komplexeren Parameter an RUN übergeben. Hier ist ein Beispiel aus einem Dockerfile, das ich zuvor heruntergeladen habe, um es anzusehen:

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \
    rm -f treeio.zip && cd treeio && pip install -r requirements.pip

Aufgrund der Verwendung von '&&' gelangt der Befehl nur zum finalen 'pip install', wenn alle vorherigen Befehle erfolgreich waren.

Tatsächlich wird für jeden RUN ein neuer Commit & (derzeit) eine AUFS-Schicht erstellt. Wenn Sie also zu viele Befehle im Dockerfile haben, werden Sie die Limits überschreiten. Das Zusammenführen der RUNs (wenn die Datei stabil ist) kann also sehr nützlich sein.

26voto

Mian Asbat Ahmad Punkte 2908

Ich habe mich gefragt, ob zwei Mal WORKDIR funktionieren würde oder nicht, aber es hat funktioniert :)

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y python3.6

WORKDIR /usr/src

COPY ./ ./

WORKDIR /usr/src/src

CMD ["python3", "app.py"]

5voto

aditya Damera Punkte 100

Sie können einen einzelnen RUN-Befehl für alle verwenden

RUN git clone XYZ && \
    cd XYZ && \
    make XYZ

3voto

jdhao Punkte 17638

Wenn Sie das Arbeitsverzeichnis für den Container ändern möchten, wenn Sie ein Docker-Image ausführen, können Sie die -w (kurz für --workdir) Option verwenden:

docker run -it -w /some/valid/directory/inside/docker {image-name}

Ref:

docker run Optionen: https://docs.docker.com/engine/reference/commandline/run/#options

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X