Файл Dockerfile не работает на бэкэнде с react

#node.js #reactjs #docker #npm #docker-compose

#node.js #реагирует на #докер #нпм #докер-сочинение

Вопрос:

Я пытаюсь запустить приложение react с 2 узловыми серверами. Один для внешнего интерфейса и один для внутреннего, подключенного к базе данных mysql.

Я пытаюсь использовать docker для контейнера, и мне удалось настроить базу данных и сервер переднего плана. Однако,когда внутренний сервер запускается, кажется, что он не подтверждает файл Dockerfile.

 node_server | npm WARN exec The following package was not found and will be installed: nodemon node_server | Usage: nodemon [nodemon options] [script.js[args] node_server |  node_server | See "nodemon --help" for more. node_server |  node_server exited with code 0  

Dockerfile — клиент:

 FROM node:latest  RUN mkdir -p /usr/src/app  WORKDIR /usr/scr/app  EXPOSE 3000  COPY package.json .  RUN npm install express body-parser nano nodemon cors  COPY . .  

Файловый сервер Dockerfile

 FROM node:latest  RUN mkdir -p /usr/src/app  WORKDIR /usr/src/app  RUN npm init -y  RUN npm install express body-parser nano nodemon cors  EXPOSE 5000  CMD ["npx", "nodemon", "src/server.js"]  

докер-сочинение

 version: '3' services:   backend:  build:  context: ./server  dockerfile: ./Dockerfile  depends_on:  - mysql  container_name: node_server  image:  raff/node_server  ports:  - "5000:5000"  volumes:  - "./server:/usr/src/app"     frontend:  build:  context: ./client  dockerfile: ./Dockerfile  container_name: node_client  image:  raff/node_client  ports:  - "3000:3000"  volumes:  - "./client:/usr/src/app"     mysql:  image: mysql:5.7.31  container_name: db  ports:  - "3306:3306"  environment:  MYSQL_ROOT_PASSWORD: admin  MYSQL_DATABASE: assignment  

Серверная часть еще не завершена, но я не верю, что это вызывает эту ошибку.

Server.js

 "use strict";  const path = require("path"); const express = require("express"); const app = express();  const bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.json());  const mysql = require("mysql");  let con = mysql.createConnection({  host: "mysql",  port: "3306",  user: "root",  password: "admin", });    const PORT = 5000; const HOST = "0.0.0.0";  app.post("/posting", (req, res) =gt; {  var topic = req.body.param1;  var data = req.body.param2;   sql_insertion(topic, data); });  // Helper const panic = (err) =gt; console.error(err);  // Connect to database con.connect((err) =gt; {  if (err) {  panic(err);  }  console.log("Connected!");  con.query("CREATE DATABASE IF NOT EXISTS assignment", (err, result) =gt; {  if (err) {  panic(err);  } else {  console.log("Database created!");  }  }); });  //select database con.query("use assignment", (err, result) =gt; {  if (err) {  panic(err);  } });  // Create Table let table =  "CREATE TABLE IF NOT EXISTS posts (ID int NOT NULL AUTO_INCREMENT, Topic varchar(255), Data varchar(255), Timestamp varchar(255), PRIMARY KEY(ID));"; con.query(table, (err) =gt; {  if (err) {  panic(err);  } else {  console.log("Table created!");  } });  app.get("*", (req, res) =gt; {  res.sendFile(path.join(__dirname, "client/build" , "index.html")); });   app.listen(PORT, HOST); console.log("up!");  

Ответ №1:

Измените эту строку

 CMD ["npx", "nodemon", "src/server.js"]  

Автор:

 CMD ["npx", "nodemon", "--exec", "node src/server.js"]  

При этом лучше поместить команду в файл package.json в разделе скрипты.

Ответ №2:

Ваши volumes: объявления скрывают все, что находится на изображении, включая его node_modules каталог. Обычно это не требуется, и вы должны иметь возможность сократить определение frontend: контейнера до

 backend:  build: ./server # default `dockerfile:` location  depends_on:  - mysql  image: raff/node_server # only if you plan to `docker-compose push`  ports:  - "5000:5000"  

Затем изображение содержит фиксированную копию приложения, так что особой необходимости в использовании нет nodemon ; просто запустите приложение напрямую.

 FROM node:latest WORKDIR /usr/src/app # also creates the directory COPY package.json package-lock.json . RUN npm ci # do not `npm install` unmanaged packages COPY . . # CHECK: `.dockerignore` must include `node_modules` EXPOSE 5000 CMD ["node", "src/server.js"]  

По-видимому, это не проблема для вашего внешнего приложения , потому что в нем есть опечатка WORKDIR -образ устанавливается и запускает свой код, /usr/scr/app но монтирование привязки завершено /usr/src/app , поэтому каталог фактического приложения /usr/scr/app/node_modules не скрыт.