web-dev-qa-db-fra.com

Comment exécuter une génération de webpack à partir d'un conteneur Docker?

L'application que je crée est écrite en ES6 et d'autres goodies sont transposés par webpack dans un conteneur Docker. Pour le moment, tout fonctionne de la création du répertoire interne, l'installation des dépendances et la création du fichier de bundle compilé.

Lorsque vous exécutez le conteneur à la place, il indique que dist/bundle.js n'existe pas. Sauf si je crée le fichier de bundle dans le répertoire Host, cela fonctionnera.

J'ai essayé de créer un volume pour le répertoire dist, il fonctionne la première fois, mais après avoir apporté des modifications et reconstruit, il ne reprend pas les nouvelles modifications.

Ce que j'essaie de réaliser, c'est de construire le conteneur et d'exécuter le bundle compilé. Je ne sais pas si la partie webpack doit être dans le Dockerfile en tant qu'étape de construction ou au moment de l'exécution depuis le CMD ["yarn", "start"] plante mais RUN ["yarn", "start"] travaux.

Toute suggestion et aide est appréciée. Merci d'avance.

|_src
  |_index.js
|_dist
  |_bundle.js
|_Dockerfile
|_.dockerignore
|_docker-compose.yml
|_webpack.config.js
|_package.json
|_yarn.lock

docker-compose.yml

version: "3.3"
services:
  server:
    build: .
    image: selina-server
    volumes:
      - ./:/usr/app/selina-server
      - /usr/app/selina-server/node_modules
      # - /usr/app/selina-server/dist
    ports:
      - 3000:3000

Dockerfile

FROM node:latest

LABEL version="1.0"
LABEL description="This is the Selina server Docker image."
LABEL maintainer="AJ [email protected]"

WORKDIR "/tmp"

COPY ["package.json", "yarn.lock*", "./"]

RUN ["yarn"]

WORKDIR "/usr/app/selina-server"

RUN ["ln", "-s", "/tmp/node_modules"]

COPY [".", "./"]

RUN ["yarn", "run", "build"]

EXPOSE 3000

CMD ["yarn", "start"]

.dockerignore

.git
.gitignore

node_modules
npm-debug.log

dist

package.json

{
  "scripts": {
    "build": "webpack",
    "start": "node dist/bundle.js"
  }
}
16
AJ_1310

Je n'ai pas inclus ma structure d'arbre src mais elle est fondamentalement identique à la vôtre, j'utilise la configuration de docker suivante pour la faire fonctionner et sa façon de développer des trucs tous les jours.

Dans package.json, nous avons

"scripts": {
    "start": "npm run lint-ts && npm run lint-scss && webpack-dev-server --inline --progress --port 6868",
}

dockerfile

FROM node:8.11.3-Alpine

WORKDIR /usr/app

COPY package.json .npmrc ./

RUN mkdir -p /home/node/.cache/yarn && \
  chmod -R 0755 /home/node/.cache && \
  chown -R node:node /home/node && \
  apk --no-cache add \
  g++ gcc libgcc libstdc++ make python

COPY . .

EXPOSE 6868

ENTRYPOINT [ "/bin/ash" ]

version de docker-compose.yml: "3"

volumes:
  yarn:

services:
  web:
    user: "1000:1000"
    build:
      context: .
      args:
        - http_proxy
        - https_proxy
        - no_proxy
    container_name: "some-app"
    command: -c "npm config set proxy=$http_proxy && npm run start"
    volumes:
      - .:/usr/app/
    ports:
      - "6868:6868"

Veuillez noter que ce Dockerfile n'est pas adapté à la production, il est destiné à un environnement de développement, car il fonctionne en tant que root.

Avec ce fichier docker, c'est un piège.

Parce que Alpine est sur musl et nous sommes sur glib si nous installons des modules de noeud sur l'hôte, les natifs compilés ne fonctionneront pas sur le conteneur docker, Une fois que le conteneur est en place si vous obtenez une erreur, nous l'exécutons pour le corriger (c'est un peu d'un plâtre collant en ce moment)

docker-compose exec container_name_goes_here /bin/ash -c "npm rebuild node-sass --force"

ikky mais ça marche.

1
krystan honour

Essayez de changer votre script de démarrage dans le package.json pour effectuer la construction en premier (ce faisant, vous n'aurez pas besoin de la commande RUN pour effectuer la construction dans votre Dockerfile:

{
  "scripts": {
    "build": "webpack",
    "start": "webpack && node dist/bundle.js"
  }
}
0
willascend