#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
не скрыт.