3 votes

Utilisez Docker pour exécuter un processus de construction

Je suis en train d'utiliser docker et docker-compose pour mettre en place un pipeline de construction. J'ai un front-end écrit en javascript qui doit être construit avant d'être utilisé. Le backend est écrit en go.

Pour que ce composant s'intègre avec le reste de notre configuration docker-compose, je veux également effectuer la construction dans une image docker.

Voici le processus que je suis en train de suivre :

  • pendant la construction :
    • construire les éléments du front-end et les placer dans /output (qui est lié au volume output
    • construire le serveur backend
  • lors de l'exécution :
    • exécuter le serveur, il a accès aux fichiers construits dans /output

Je suis assez novice en docker et docker-compose donc je ne suis pas sûr que cela est possible, ou même la bonne chose à faire.

Pour référence, voici mon docker-compose.yml :

version: '2'
volumes:
  output:
    driver: local

services:
  frontend:
    build: .
    volumes:
      - output:/output
  backend:
    build: ./backend
    depends_on:
      - frontend
    volumes:
      - output:/output

et Dockerfile :

FROM node

# créer le répertoire de travail
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/package.json

# installer les paquets
RUN npm install
COPY . /usr/src/app

# construire les fichiers front-end et placer les résultats dans /output
RUN npm build
RUN cp /usr/src/app/build/* /output

Et backend/Dockerfile :

 FROM go

 # copier et construire le serveur
 COPY . /usr/src/backend
 WORKDIR /usr/src/backend
 RUN go build

 # exécuter le serveur
 ENTRYPOINT ["/usr/src/backend/main"]

Il y a quelque chose qui ne va pas ici, mais je ne sais pas quoi. Il semble que la sortie de l'étape de construction ne soit pas persistée dans le volume output. Que puis-je faire pour résoudre ce problème ?

3voto

user801247 Points 878

Vous ne pouvez pas attacher un volume pendant docker build. La raison en est que le but de la commande docker build est de construire une image, et rien d'autre, elle n'a pas besoin d'avoir des volumes, car le Dockerfile a ADD / COPY.

Pour produire votre sortie, vous devriez créer un script qui fait principalement le npm install ; npm build ; cp /usr/src/app/build/* /output à partir de votre fichier Docker actuel et utilisez ce script en tant que point d'entrée / cmd dans votre fichier Docker.

Je ne suis pas sûr que compose puisse exécuter ceci, mais de toute manière, je trouve que c'est plus clair enveloppé dans un script shell qui exécute d'abord le conteneur de construction frontend, puis exécute le conteneur backend avec le répertoire de sortie comme volume.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X