2014-10-24 1 views
10

Wenn ich eine Datei oder ein Verzeichnis zu Docker Image durch eine Dockerfile hinzufüge, verwende ich ADD oder COPY, aber der Dateipfad, den ich hinzufügen oder kopieren möchte, muss einen relativen Pfad zum Dockerfile-Verzeichnis haben. Gibt es eine Methode zum Hinzufügen einer Datei oder eines Verzeichnisses von localhost zu docker image mit dem absoluten Pfad? übrigens, warum der "docker cp" kann nur kopieren kopierdatei von docker image zu localhost? im Gegenteil, es funktioniert nicht?Wie kann ich ein Verzeichnis oder eine Datei in ein Docker-Image von localhost auf ubuntu14.04 kopieren?

+2

Um die Docker-Dokumentation zu zitieren: Die Kopie folgt den folgenden Regeln: Der Pfad muss im Kontext des Builds sein; –

+0

Mögliches Duplikat von [Docker: Hinzufügen einer Datei aus einem übergeordneten Verzeichnis] ​​(http://stackoverflow.com/questions/24537340/docker-adding-a-file-from-a-parent-directory) – Gordon

Antwort

11

Die kurze Antwort ist, dass es nicht unterstützt wird.

Von der Docker docs:

Die <src> Papierweg in Zusammenhang mit der Build sein muss; Sie können nicht ../etwas/etwas, HINZUFÜGEN, da der erste Schritt eines Docker-Builds ist, das Kontextverzeichnis (und die Unterverzeichnisse) an den Docker-Dämon zu senden.

Des Weiteren sind symbolische Links nicht unterstützt, so dass es durch die Verknüpfung zu einer anderen Stelle auf dem lokalen Host nicht möglich Trick der Build ist.

URL: s werden unterstützt so eine Möglichkeit, um das Problem zu umgehen, ist es, die Dateien über HTTP zu dienen, wenn Sie einen Webserver auf Ihrem lokalen Host (oder in einem Docker-Container) aktivieren.

Der Befehl docker cp (leider) wird nur vom Container zum Host unterstützt, nicht umgekehrt. Dies ist in der docs beschrieben. Um dies zu umgehen, verwenden Sie docker volumes, wo die Daten gemeinsam genutzt werden können.

+1

['docker cp' ] (https://docs.docker.com/engine/reference/commandline/cp/) kann nun Dateien in beide Richtungen kopieren. – Zaz

0

Es gibt eine Abhilfe, wenn Sie docker-compose verwenden:

api1: 
    build: . 
    dockerfile: cluster/manifests/Dockerfile-NodeAPI 
    ports: 
    - 8080 
    links: 
    - mongo 
    - redis 
    command: "nodemon lib/app.js -e js,json,scss,css,html" 

Dies wird immer noch nicht zulassen, dass Sie Verwandte Pfade zu tun, aber basepath im Dockerfile wird ./ statt cluster/manifests/

1

Die Lösung für Diejenigen, die Composer verwenden, verwenden eine volume, die auf den Ordner zeigt:

Aber ich bin mir ziemlich sicher, dass das mit volumes in Dockerfile gemacht werden kann.

0

eine Datei zu kopieren, verwenden Sie einfach docker cp:

docker cp file.txt CONTAINER:/path/to/dest 

ein Verzeichnis zu kopieren, ein tar-Rohr verwenden:

tar -c "dir/" | docker run -i -a stdin CONTAINER tar -xC /path/to/dest 
0

auf Antwort wassgren der Darlegung, Sie können Sie auch eine Docker SDK zu mach das. Ich bin mir nicht sicher über jedes SDK, aber mindestens docker-java sendet den Kontext als Eingangsstrom an Docker. So geben Sie dockerClient.withBaseDirectory() und dockerClient.withDockerFile() an. Sie könnten einen mehr Scripting-Ansatz verwenden und verwenden Sie gradle oder groovy, um dies zu tun und zu vermeiden, "Java" für jedes Mal zu "kompilieren".

Verwandte Themen