2016-10-29 2 views
2

Ich bin neu in Docker und ich versuche, ein kleines Dockefile für Apache nur zum Testen zu bauen.Verwenden von COPY auf Dockerfile für Apache Build

FROM httpd:2.2.31 

RUN mkdir -p /opt/mw/apache-test/logs 

ADD ./httpd-custom.conf /usr/local/apache2/conf/httpd.conf 
COPY /opt/mw/apache-2.2.31-instance1/htdocs/ /usr/local/apache2/htdocs/ 

Aber aus irgendeinem Grund bekomme ich einen Fehler mit der COPY. Ich habe auch versucht, ADD zu verwenden.
Dies ist der Fehler, den ich habe:

Step 4 : COPY /opt/mw/apache-2.2.31-instance1/htdocs/ /usr/local/apache2/htdocs/ 
lstat opt/mw/apache-2.2.31-instance1/htdocs/: no such file or directory 

Was mache ich falsch?

+0

Ist das Verzeichnis /opt/mw/apache-2.2.31-instance1/htdocs/ auf dem Host existieren? – harrybvp

+1

Und noch wichtiger, existiert das Verzeichnis in dem Pfad, den Sie übergeben, als Kontext für die Erstellung Ihres Bildes? Versuchen Sie auch, ADD und COPY nicht zu mischen, Docker empfiehlt die Verwendung von COPY. Und entfernen Sie den abschließenden Schrägstrich im Quellordner – R0MANARMY

+0

Für die erste Frage, ja das Verzeichnis vorhanden. Es ist die, die ich zum Testen benutzt habe. Für die zweite Frage. Ich denke, es existiert, ich benutze das Apache-Image. https://hub.docker.com/_/httpd/ – radicaled

Antwort

2

Verstehen Sie, dass Sie die Volumes nicht mounten möchten, sondern dass diese Dateien Teil des Bildes sein sollen, damit sie geteilt werden können. Nehmen wir das zumindest an.

Gemäß dem Docker documentation

COPY gehorcht die folgenden Regeln:
- Der Weg in dem Kontext des Build sein muss; Sie können COPY ../etwas/etwas nicht kopieren, da der erste Schritt eines Docker-Builds darin besteht, das Kontextverzeichnis (und die Unterverzeichnisse) an den Docker-Daemon zu senden.
- Wenn es sich um ein Verzeichnis handelt, wird der gesamte Inhalt des Verzeichnisses einschließlich Dateisystem-Metadaten kopiert.

Sie könnten das Problem jetzt haben. In Ihrer Dockerfile, d. H. COPY Anweisung ist das Problem, da es sich auf den absoluten Pfad bezieht, der der obigen ersten Regel nicht folgt. Daher sollte htdocs im lokalen Verzeichnis verfügbar sein, von dem aus Sie den Befehl docker build ausführen.

Folgende Änderungen müssen vor dem Bau das Bild gemacht:

  • Hoffnung, die Sie vielleicht schon ein Verzeichnis erstellt haben (die Sie Bild bauen) und dieses Verzeichnis enthält Dockerfile, httpd-custom.conf Dateien.
  • Gehen Sie nun in das obige Verzeichnis und kopieren Sie /opt/mw/apache-2.2.31-instance1/htdocs in das aktuelle Verzeichnis. So kann das Verzeichnis htdocs jetzt Teil des Kontexts sein (wie in den Dokumenten erwähnt), während das Bild erstellt wird.
  • ändern Sie die Inhalte von Dockerfile den folgenden (vor allem COPY-Befehl):
FROM httpd:2.2.31 

RUN mkdir -p /opt/mw/apache-test/logs 

ADD ./httpd-custom.conf /usr/local/apache2/conf/httpd.conf 
COPY htdocs /usr/local/apache2/htdocs 

Jetzt sollten Sie in der Lage sein, erfolgreich zu bauen.

Für nur Demo, verwendet, um ein geringes Gewicht busybox und ein Verzeichnis im selben Kontext erstellen (Ihr Fall zu simulieren) und es tut wie Sie unten sehen:

$ more Dockerfile 
FROM busybox 
COPY data_folder /opt/data_folder 
CMD ["ls", "/opt/data_folder"] 

$ ls 
data_folder Dockerfile 
$ ls data_folder/ 
test.txt 

Build-Bild:

$ sudo docker build -t dirtest . 
Sending build context to Docker daemon 3.584 kB 
Step 1 : FROM busybox 
---> e02e811dd08f 
Step 2 : COPY data_folder /opt/data_folder 
---> b6b1a9555825 
Removing intermediate container b682e0467803 
Step 3 : CMD ls /opt/data_folder 
---> Running in 3b05f08ceafc 
---> b73190fc1fd9 
Removing intermediate container 3b05f08ceafc 
Successfully built b73190fc1fd9 

Wird über Bild in einem Container ausgeführt, der zeigt, dass das Verzeichnis 'data_folder' kopiert wird und seinen Inhalt anzeigt. In Ihrem Fall ist es htdocs

$ sudo docker run -it --rm --name testdirtest dirtest 
test.txt 
2

Dateien, die Sie ADD oder COPY in ein Docker-Image einfügen, müssen in Ihrem Build-Verzeichnis vorhanden sein. Wenn Sie docker build -t myimage . ausführen, dann ist . Ihr Build-Verzeichnis. Die Datei docker build packt alle Dateien im Build-Verzeichnis ein, wobei alle in .dockerignore aufgelisteten Dateien ausgelassen werden, und lädt sie auf den Docker-Host hoch, mit dem Sie verbunden sind (dies kann ein Remote-Server sein).

Wenn Sie einfach möchten, dass die HTDocs innerhalb des laufenden Containers zugänglich sind, dann würde ich das Host-Verzeichnis in den Container als ein Volume während docker run binden. Zum Beispiel docker run -v /opt/mw/apache-2.2.31-instance1/htdocs/:/usr/local/apache2/htdocs/:ro yourimagename. In der Tat nur, wenn Ihr Dockerfile diese Zeilen hat, können Sie vollständig den Build überspringen und laufen:

docker run \ 
    -v `pwd`/httpd-custom.conf:/usr/local/apache2/conf/httpd.conf:ro \ 
    -v /opt/mw/apache-2.2.31-instance1/htdocs/:/usr/local/apache2/htdocs/:ro \ 
    -v `pwd`/logs:/opt/mw/apache-test/logs \ 
    httpd:2.2.31 

Beachten Sie, dass wenn Sie mit Docker für Windows oder Mac, diese Host-Verzeichnisse in einem gemeinsamen Verzeichnis sein müssen mit der Docker-VM, die standardmäßig den Ordner/Benutzer enthält.

+0

Eigentlich hat das funktioniert, aber ich wollte ein Bild mit dem Dockerfile zum Testen erstellen – radicaled

+0

Um das Bild aufzubauen, dann folgen Sie einfach den Anweisungen in meinem ersten Absatz, bewegen/opt/mw/... in dein Build-Verzeichnis. – BMitch

Verwandte Themen