Ich lerne Docker. Ich habe schon oft gesehen, dass Dockerfile
das WORKDIR
Befehl hat:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 3000
CMD [ “npm”, “start” ]
Kann ich nicht einfach weglassen WORKDIR
und Copy
meine Dockerfile
an der Wurzel meines Projekts haben? Was sind die Nachteile dieses Ansatzes?
docker
dockerfile
Le garcon
quelle
quelle
WORKDIR
Antworten:
Laut Dokumentation :
In den Best Practices von Docker wird außerdem empfohlen, Folgendes zu verwenden:
Ich würde vorschlagen, es zu behalten.
Ich denke, Sie können Ihre Docker-Datei in Folgendes umgestalten:
quelle
FROM ubuntu as builder
und dann das nachfolgende Bild verwendeCOPY
, "weiß" es, dass ich WORKDIR im "Builder" -Bild verwendet habe, oder muss ich nicht annehmen (und einen absoluten Pfad verwenden)?WORKDIR
Wert , weil ein Befehl RAN in der Dockerfile ist , bevor Sie den LaufCOPY
einRUN mkdir
Befehl ist nicht notwendig; dh diese Zeile könnte gelöscht werden. Gemäß der Dokumentation "Wenn das WORKDIR nicht vorhanden ist, wird es erstellt, auch wenn es in keiner nachfolgenden Dockerfile-Anweisung verwendet wird." - docs.docker.com/engine/reference/builder/#workdirDas musst du nicht
RUN mkdir -p /usr/src/app
Dies wird automatisch erstellt, wenn Sie Ihre angeben
WORKDIR
quelle
Sie können sich
WORKDIR
wie in einemcd
Container vorstellen (dies wirkt sich auf Befehle aus, die später in der Docker-Datei eingehen, wie z. B. denRUN
Befehl). Wenn SieWORKDIR
in Ihrem obigen Beispiel entfernt haben,RUN npm install
würde dies nicht funktionieren, da Sie sich nicht im/usr/src/app
Verzeichnis in Ihrem Container befinden würden.Ich sehe nicht, wie dies damit zusammenhängt, wo Sie Ihre Docker-Datei ablegen (da Ihr Docker-Datei-Speicherort auf dem Host-Computer nichts mit dem pwd im Container zu tun hat). Sie können die Docker-Datei an einer beliebigen Stelle in Ihrem Projekt ablegen. Das erste Argument
COPY
ist jedoch ein relativer Pfad. Wenn Sie also Ihre Docker-Datei verschieben, müssen Sie dieseCOPY
Befehle möglicherweise aktualisieren .quelle
WORKDIR
hinzugefügtcd
wird, haben die beidenCOPY
im ursprünglichen Beispiel nicht dieselbe Quelle und dasselbe Ziel?WORKDIR
Beeinflusst das Arbeitsverzeichnis im Container . Im ursprünglichen Beispiel werden die erstenCOPY
Kopien vompackage.json
Host (relativer Pfad zur Docker-Datei)/usr/src/app/package.json
in den Container kopiert . Tatsächlich hat dasWORKDIR
keine Auswirkungen auf diesen bestimmten Befehl, da das Ziel (innerhalb des Containers) keinen relativen Pfad verwendet (der Pfad beginnt mit/
).WORKDIR
wie eincd
. Entsprechen die 2 Schnipsel darunter?WORKDIR /usr/src/app
COPY package.json /usr/src/app/
undWORKDIR /usr/src/app
COPY package.json .
dankeVor dem Auftragen von WORKDIR. Hier ist der WORKDIR am falschen Ort und wird nicht mit Bedacht eingesetzt.
Wir haben den obigen Code korrigiert, um WORKDIR an der richtigen Stelle zu platzieren, und die folgenden Anweisungen durch Entfernen optimiert
/Publish
quelle
Achten Sie darauf, dass Sie vars nicht als Zielverzeichnisnamen verwenden.
WORKDIR
Dies scheint zu einem schwerwiegenden Fehler zu führen, bei dem nichts normalisiert werden kann. IMO, es ist auch erwähnenswert, dass esWORKDIR
sich genauso verhält wiemkdir -p <path>
alle Elemente des Pfades erstellt werden, wenn sie noch nicht vorhanden sind.UPDATE: Ich bin beim Ausführen eines mehrstufigen Builds auf das oben erwähnte variable Problem gestoßen. Es scheint nun, dass die Verwendung einer Variablen in Ordnung ist. Wenn sie (die Variable) "im Gültigkeitsbereich" ist, z. B. im Folgenden,
WORKDIR
schlägt die zweite Referenz fehl ...in der Erwägung, dass dies gelingt ...
.oO ( Vielleicht ist es in den Dokumenten und ich habe es verpasst )
quelle
Seien Sie vorsichtig, wo Sie einstellen,
WORKDIR
da dies den kontinuierlichen Integrationsfluss beeinträchtigen kann. Wenn Sie es beispielsweise so einstellen,/home/circleci/project
wird ein Fehler verursacht, wie.ssh
oder was auch immer der Remote Circleci zur Einrichtungszeit tut.quelle