【问题标题】:making docker compose use already created database使 docker compose 使用已经创建的数据库
【发布时间】:2021-03-14 15:57:44
【问题描述】:

我正在尝试使用带有 docker-compose 的 nodejs 启动 mysql,并且我希望 docker-compose 使用连接到已创建的随机数据库 但是,当我运行 docker-compose 时,控制台告诉我它正在创建数据库“随机”,它不应该因为数据库已经创建。 有人可以帮帮我吗?

version: "3.2"
services:
  nodejs:
    build: ./
    image: nodejs
    container_name: nodejs
    restart: unless-stopped
    ports:
      - "3002:3002"
    depends_on:
      - mysql
  mysql:
    image: mysql:latest
    ports:
      - 3306
    environment:
      - MYSQL_ROOT_PASSWORD=boom
      - MYSQL_PASSWORD=passeord
      - MYSQL_DATABASE=random
      - MYSQL_HOST=0.0.0.0
      - MYSQL_PORT=3306

码头文件

FROM node:8

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3002 
CMD [ "npm", "start" ]

server.js

var mysql = require('mysql');
var express = require('express');
const port = 3002;
var app = express();
var bodyParser = require("body-parser"); // Body parser for fetch posted data
var responseStr = "MySQL Data:";
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());


app.get('/',function(req,res){
   
   var mysqlHost = process.env.MYSQL_HOST || 'localhost';
   var mysqlPort = process.env.MYSQL_PORT || '3306';
   var mysqlUser = process.env.MYSQL_USER || 'root';
   var mysqlPass = process.env.MYSQL_PASS || 'password';
   var mysqlDB   = process.env.MYSQL_DB   || 'random; //this database is already created

   var connectionOptions = {
     host: mysqlHost,
     port: mysqlPort,
     user: mysqlUser,
     password: mysqlPass,
     database: mysqlDB
   };

   console.log('MySQL Connection config:');
   console.log(connectionOptions);

   var connection = mysql.createConnection(connectionOptions);
   
   connection.connect();
 
   connection.query(queryStr, function (error, results, fields) {
     if (error) throw error;
     
     responseStr = '';

     results.forEach(function(data){
        responseStr += data.ITEM_NAME + ' : ';
        console.log(data);
     });

     if(responseStr.length == 0)
        responseStr = 'No records found';

     console.log(responseStr);

     res.status(200).send(responseStr);
   });
    
   connection.end();
});


const router = app => {
    // Display welcome message on the root
    app.get('/hi', (request, response) => {
        response.send({
            message: 'whats up!?'
        });
});

【问题讨论】:

  • 您没有声明任何volumes: 来保存数据库数据,因此每次删除并重新创建数据库容器时,它都会从头开始。这本质上是您遇到的问题,还是您希望数据库数据存在于其他地方(也许在基于主机或云托管的数据库中)?

标签: mysql node.js docker docker-compose


【解决方案1】:

@david-maze 提供了答案。

你想做类似的事情:

  mysql:
    image: mysql:latest
    ports:
      - 3306
    environment:
      - MYSQL_ROOT_PASSWORD=boom
      - MYSQL_PASSWORD=passeord
      - MYSQL_DATABASE=random
      - MYSQL_HOST=0.0.0.0
      - MYSQL_PORT=3306
    volumes:
    - your-database:/var/lib/mysql

volumes:
  your-database:
    external: true

或者:

  mysql:
    image: mysql:latest
    ports:
      - 3306
    environment:
      - MYSQL_ROOT_PASSWORD=boom
      - MYSQL_PASSWORD=passeord
      - MYSQL_DATABASE=random
      - MYSQL_HOST=0.0.0.0
      - MYSQL_PORT=3306
    volumes:
    - /path/to/your-database:/var/lib/mysql

第一个示例使用名为 your-database 的 docker 卷。你可以预先创建这个docker volume create your-database。使用这种机制,您将需要运行一次mysql 来创建数据库。随后,运行docker compose 将重用它。

第二个示例使用您主机上的目录(将/path/to/your-database 替换为您希望在其中创建数据库的主机上的目录。如果您已经在本地存储了数据库,则可以通过这种方式重用它。如果没有,您需要先在本地创建它。这种方法不是“可移植的”,撰写与您的主机相关联。

【讨论】:

  • 您好,谢谢您的回答。您对主机上的导演到底是什么意思?
  • 不客气!假设您的docker-compose.yaml/path/to/docker-compose.yaml 中,您的机器(主机)上可以有另一个位置,假设一个名为/another/path/to/db 的目录。在docker-compose.yaml 文件中,您可以将此目录指定为:YAML volumes: - /another/path/to/db:/var/lib/mysql 语法为volumes: - [[host-path]]:[[container-path]]
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2021-03-13
  • 2020-07-08
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多