3 votes

Pourquoi Docker-compose ne parvient-il pas à copier les fichiers locaux dans le conteneur ?

Je suis en train de construire une application DotnetCore simple avec le support de docker-compose avec VS2017.

J'ai deux Dockerfile, un pour l'application et un pour un proxy NGINX. En plus de cela, il y a un fichier docker-compose.yml qui regroupe les deux.

Voici le Dockerfile de l'application aspnetcore, il y a beaucoup d'instructions COPY dedans et elles fonctionnent toutes correctement !

FROM microsoft/dotnet:2.0-runtime AS base
WORKDIR /app

FROM microsoft/dotnet:2.0-sdk AS build
WORKDIR /src
COPY CoreServer.sln ./
COPY CoreServer/CoreServer.csproj CoreServer/
RUN dotnet restore -nowarn:msb3202,nu1503
COPY . .
WORKDIR /src/CoreServer
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "CoreServer.dll"]

C'est le Dockerfile de nginx qui n'arrive pas à copier les fichiers correctement. Au lieu de cela, il produit l'erreur suivante :

Échec de la copie : stat /var/lib/docker/tmp/docker-builder780242597/nginx.conf : aucun fichier ou répertoire de ce type. #1859

FROM nginx

WORKDIR /etc/nginx

COPY nginx.conf ./
COPY server.crt ./
COPY server.key ./

J'ai essayé de construire ce Dockerfile par lui-même et il fonctionne, mais lorsque j'utilise docker-compose, il donne l'erreur ci-dessus.

Voici à quoi ressemble le fichier docker-compose.yml

version: '3'

services:
  coreserver:
    image: coreserver
    build:
      context: .
      dockerfile: CoreServer/Dockerfile
    expose:
      - "5000"

  nginx:
    build: 
      context: .
      dockerfile: nginx/Dockerfile
    ports:
      - "80:80"
      - "443:443"
    links:
      - coreserver

Si vous voulez regarder le projet complet, il s'agit d'une application de test de serveur websocket dotnetcore avec un serveur et une application client.

https://github.com/avboivin/WssCoreServer/tree/master/server

Quelqu'un peut-il me dire ce que je fais de mal pour que docker envoie cette erreur particulière ?

4voto

guhkun13 Points 141

De https://docs.docker.com/engine/reference/builder/#copy . dit :

COPY obéit aux règles suivantes :

  • Le chemin [src] doit se trouver dans le contexte de la construction ; vous ne pouvez pas COPIER ../quelque chose /quelque chose, car la première étape de la construction d'un docker consiste à envoyer le répertoire du contexte (et les sous-répertoires) au démon docker.

  • Si [src] est un répertoire, le contenu entier du répertoire est copié, y compris les métadonnées du système de fichiers.

donc ce ne sont pas des bugs . COPY ne peut pas lire les fichiers à partir de votre chemin absolu.

La solution est donc de créer votre docker-compose.yml dans le même répertoire que votre répertoire/fichiers SOURCE et de l'exécuter.

2voto

A_V Points 151

Il semblerait que ce soit un bug.

J'ai trouvé la solution ici :

https://github.com/docker/for-mac/issues/1922#issuecomment-355364451

Il s'agissait simplement de déplacer le fichier Docker qui posait problème au niveau de la racine du fichier docker-compose.yaml.

0voto

Comme @guhkun13 l'a mentionné, vous devez être dans le bon contexte pour que la COPIE fonctionne. Dans docker-compose.yml, vous pouvez définir ceci sous

services:
  <your_service_name>:
    build:
      context:

Notez que vous avez donné le contexte '.' pour les deux services. Donc COPY prend le répertoire racine comme contexte. Modifiez le fichier docker-compose.yml comme suit et le problème sera résolu.

version: '3'
services:
  coreserver:
    image: coreserver
    build:
      context: CoreServer
    expose:
      - "5000"

  nginx:
    build: 
      context: nginx
    ports:
      - "80:80"
      - "443:443"
    links:
      - coreserver

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X