2017-12-13 16 views
2

Ich baue eine App mit multiple dockerfiles (eine für jeden Dienst). Meine App-Verzeichnisstruktur ist wie folgt:Docker: COPY verwenden, wenn die Dockerfile in einem Unterverzeichnis befindet

app 
├── dockerfiles 
│ ├── webserver 
│ │ └── Dockerfile 
│ └── database 
│  └── Dockerfile 
├── public 
    └── <frontend> 
├── db 
    └── <data> 
    [...] 
├── LICENSE 
├── README.md 
└── docker-compose.yml 

In meinem Webserver des Dockerfile, möchte ich in meinem vorhandenen Code kopieren mit dem COPY Befehl:

# Dockerfile 
COPY ./public /var/www/html 

Und ich möchte die App mit meinem docker-compose.yml bereitstellen Datei:

# docker-compose.yml 
version: "3" 
services: 
    webserver: 
     build: ./dockerfiles/webserver 
     image: webserver:php-apache 

Allerdings, wenn ich docker-compose aus dem Arbeitsverzeichnis (app) laufen lasse, erhalte ich die fo llowing Fehler:

Building webserver 
Step 1/2 : FROM php:7.1.11-apache-jessie 
---> cb6a5015ad72 
Step 2/2 : COPY ./public /var/www/html 
Service 'webserver' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder193736188/public: no such file or directory 

Dieser Fehler verschwindet, wenn ich meinen Webservers Dockerfile auf die App-Wurzel zu bewegen, damit ich weiß, dass es durch eine Pfad verursacht werden werden oder Kontext Problem bauen.

Und das wissen, können wir das Problem einer von zwei Möglichkeiten beheben, indem Sie entweder:

(1) Unter Verwendung einer Dockerfile für die gesamte App (im Stamm App) oder

app 
└── Dockerfile 

(2) Verwenden von mehreren Dockerfiles für jeden Dienst (im Stamm der App).

app 
├── Dockerfile.webserver 
└── Dockerfile.database 

Diese Lösungen sind schlecht, weil für alles, was man dockerfile/Behälter mit nicht best practice (1) ist, und sieht auf diese Weise organisiert mehrere dockerfiles mit nur unordentlich (2).


Also, meine Frage ist:

Wie beheben wir dieses Problem ohne unsere ursprüngliche Verzeichnisstruktur zu ändern?

  • Welche Änderungen müssen die dockerfiles gemacht werden, zu docker-compose.yml, oder auf die Grundlaufzeit Befehle?
  • Gibt es eine bessere Möglichkeit, alles zu organisieren?
  • Was ist mit dem Befehl WORKDIR?

Idealerweise sollte die beste Lösung für beide dev (local) arbeiten und Produktion (remote) Umgebungen, also lassen Sie uns jetzt Bände vermeiden ...

Antwort

2

Sie müssen nur context: . und dockerfile in Ihrem Build-Abschnitt innerhalb Ihrer docker-compose.yml-Datei hinzufügen, damit Ihr Service die vollständige Verzeichnisstruktur versteht.

# docker-compose.yml 
version: "3" 
services: 
    webserver: 
    build: 
     context: . 
     dockerfile: ./dockerfiles/webserver/Dockerfile 
    image: webserver:php-apache 
+0

Das hat perfekt funktioniert! Ich wusste, dass es ein Problem mit dem Aufbaukontext sein musste, aber ich hatte so viel Mühe, nach einer Lösung zu suchen ... Hoffentlich hilft das jemandem in einer ähnlichen Situation in naher Zukunft! – CodyAE

0

Der Spielraum für die COPY Anweisung ist der Ordner, in dem Dockerfile ist. Mein Vorschlag ist, Ihre Dockerfile zu einem öffentlichen Ordner zu ändern und die Anweisung in COPY . /var/www/html zu ändern.

Verwandte Themen