【问题标题】:Dockerfile not working on backend with reactDockerfile 在后端无法使用反应
【发布时间】:2022-01-12 01:36:48
【问题描述】:

我正在尝试使用 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

服务器端还没有完成,但我不相信它会导致这个错误。

服务器.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) => {
  var topic = req.body.param1;
  var data = req.body.param2;

  sql_insertion(topic, data);
});

// Helper
const panic = (err) => console.error(err);

// Connect to database
con.connect((err) => {
  if (err) {
    panic(err);
  }
  console.log("Connected!");
  con.query("CREATE DATABASE IF NOT EXISTS assignment", (err, result) => {
    if (err) {
      panic(err);
    } else {
      console.log("Database created!");
    }
  });
});

//select database
con.query("use assignment", (err, result) => {
  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) => {
  if (err) {
    panic(err);
  } else {
    console.log("Table created!");
  }
});

app.get("*", (req, res) => {
  res.sendFile(path.join(__dirname, "client/build" , "index.html"));
});


app.listen(PORT, HOST);
console.log("up!");

【问题讨论】:

    标签: node.js reactjs docker npm docker-compose


    【解决方案1】:

    修改这一行

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

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

    将命令放在 package.json 中的 scripts 部分更好。

    【讨论】:

      【解决方案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 目录未隐藏。

      【讨论】:

        猜你喜欢
        • 2022-01-25
        • 2023-03-19
        • 2021-06-10
        • 1970-01-01
        • 2021-06-18
        • 2021-07-12
        • 2021-06-13
        • 2022-01-10
        相关资源
        最近更新 更多