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 ...
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