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