Innerhalb meiner Docker-Dateien möchte ich eine Datei in mein Bild kopieren, falls vorhanden. Die Datei "require.txt" für pip scheint ein guter Kandidat zu sein, aber wie würde dies erreicht werden?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
oder
if test -e requirements.txt; then
COPY requiements.txt /destination;
fi
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
docker
dockerfile
derrend
quelle
quelle
Antworten:
Dies wird derzeit nicht unterstützt (da ich vermute, dass dies zu einem nicht reproduzierbaren Bild führen würde, da dieselbe Docker-Datei die Datei je nach Existenz kopieren würde oder nicht).
Dies wird in Ausgabe 13045 weiterhin mithilfe von Platzhaltern angefordert : "
COPY foo/* bar/" not work if no file in foo
" (Mai 2015).Es wird vorerst (Juli 2015) nicht in Docker implementiert, aber ein anderes Build-Tool wie Bocker könnte dies unterstützen.
quelle
dev
Umgebung mit einem Webpack-Entwicklungsserver ausgeführt wird und die entsprechendeprod
Umgebung mit einem/dist
statischen Ordner funktioniert ? Dies ist heute bei den meisten Front-End-Setups der Falldev
undprod
kann hier offensichtlich nicht dasselbe sein. Wie soll man damit umgehen?Hier ist eine einfache Problemumgehung:
Stellen Sie sicher
foo
, dass vorhanden ist, daCOPY
mindestens eine gültige Quelle benötigt wird.Wenn
file-which-may-exist
vorhanden, wird es auch kopiert.HINWEIS: Sie sollten darauf achten, dass Ihr Platzhalter keine anderen Dateien aufnimmt, die Sie nicht kopieren möchten. Um vorsichtiger zu sein, können Sie
file-which-may-exist?
stattdessen verwenden (?
entspricht nur einem einzelnen Zeichen).Oder noch besser, verwenden Sie eine Zeichenklasse wie diese, um sicherzustellen, dass nur eine Datei abgeglichen werden kann:
quelle
COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/
RUN mv /tmp/docker/docker /usr/bin/docker
RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true
(wo die gemeinsam genutzte Bibliothek die unbekannte Entität ist.)Wie in diesem Kommentar angegeben , kopiert die Antwort von Santhosh Hirekerur die Datei weiterhin. Um eine echte bedingte Kopie zu archivieren, können Sie diese Methode verwenden.
Die
ONBUILD
Anleitung stellt sicher, dass die Datei nur kopiert wird, wenn der "Zweig" von der ausgewählt wirdBUILD_ENV
. Stellen Sie diese Variable vor dem Aufruf mit einem kleinen Skript eindocker build
quelle
Lösung umgehen
Ich musste FOLDER basierend auf ENV-Variablen auf den Server kopieren. Ich habe das leere Server-Image aufgenommen. Die erforderliche Bereitstellungsordnerstruktur wurde im lokalen Ordner erstellt. dann unter der Zeile zu DockerFile hinzugefügt, kopieren Sie den Ordner in den Container. In der letzten Zeile wurde ein Einstiegspunkt hinzugefügt, um init file.sh auszuführen, bevor Docker den Server startet.
Erstellen Sie dann die Datei custom-init.sh in lokaler Sprache mit einem Skript wie dem folgenden
In der Docker-Compose- Datei unter den Zeilen.
Umgebung: - BUILD_EVN = TEST
Diese Änderungen kopieren den Ordner während des Docker-Builds in den Container. Wenn wir Docker-Compose ausführen , kopieren Sie den tatsächlich erforderlichen Ordner oder stellen Sie ihn auf dem Server bereit, bevor der Server gestartet wird.
quelle
Kopieren Sie alle Dateien in ein Wegwerfverzeichnis, wählen Sie die gewünschte aus und verwerfen Sie den Rest.
Sie können etwas Ähnliches erreichen, indem Sie Build-Phasen verwenden, die auf derselben Lösung basieren und
cp
zum bedingten Kopieren verwendet werden. Wenn Sie eine Erstellungsphase verwenden, enthält Ihr endgültiges Image nicht den gesamten Inhalt der ursprünglichen PhaseCOPY
.quelle
cache
und je nachdem, was der Cache ist, wähle ich, was in Skriptdateien zu tun ist!Versuchte die anderen Ideen, aber keine erfüllte unsere Anforderung. Die Idee ist, ein Basis-Nginx-Image für untergeordnete statische Webanwendungen zu erstellen. Aus Sicherheits-, Optimierungs- und Standardisierungsgründen muss das Basisimage
RUN
Befehle für Verzeichnisse enthalten können, die von untergeordneten Images hinzugefügt wurden. Das Basisbild steuert nicht, welche Verzeichnisse von untergeordneten Bildern hinzugefügt werden. Angenommen, untergeordnete Bilder werdenCOPY
irgendwo unter Ressourcen gespeichertCOMMON_DEST_ROOT
.Dieser Ansatz ist ein Hack, aber die Idee ist, dass das Basis-Image
COPY
Anweisungen für 1 bis N Verzeichnisse unterstützt, die vom untergeordneten Image hinzugefügt werden.ARG PLACEHOLDER_FILE
undENV UNPROVIDED_DEST
werden verwendet , um zu erfüllen<src>
und<dest>
Anforderungen für jedeCOPY
Anweisung nicht erforderlich.Diese Lösung weist offensichtliche Mängel auf, wie den Dummy
PLACEHOLDER_FILE
und die fest codierte Anzahl der unterstützten COPY-Anweisungen. Es gibt auch keine Möglichkeit, die in der COPY-Anweisung verwendeten ENV-Variablen zu entfernen.quelle