Не удается решить MongoParseError: неверная строка подключения - PullRequest
1 голос
/ 30 мая 2019

Я не могу решить MongoParseError.

Сначала я попробовал это

mongoose.connect(`mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@db:27017/${process.env.DB_NAME}`, {useNewUrlParser: true});

заставил меня оказаться в этой ошибке

MongoParseError: Unescaped slash in userinfo section

Тогда я избежал всех ударов

mongoose.connect(`mongodb:\\/\\/${process.env.DB_USER}:${process.env.DB_PASSWORD}@db:27017\\/${process.env.DB_NAME}`, {useNewUrlParser: true});

и я оказался в этой ошибке, которую я не могу решить

MongoParseError: Invalid connection string

Это мой index.js

'use strict';

const mongoose = require('mongoose');
mongoose.connect(`mongodb:\\/\\/${process.env.DB_USER}:${process.env.DB_PASSWORD}@db:27017\\/${process.env.DB_NAME}`, {useNewUrlParser: true});

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  console.log('ok');
});

const express = require('express');

// Constants
const PORT = 8080;
const HOST = 'localhost';


var kittySchema = new mongoose.Schema({
  name: String
});

var Kitten = mongoose.model('Kitten', kittySchema);

var silence = new Kitten({ name: 'Test1234' });


// App
const app = express();
app.get('/', (req, res) => {
  res.send(silence.name);
});

app.listen(PORT);
console.log(`Running on http://${HOST}:${PORT}`);

А вот докер-compose.yml

version: '3.7'
services:
  web:
    build: .
    command: npm start
    volumes:
      - ./src:/usr/app/
      - ./src/node_modules:/usr/app/node_modules
    ports:
      - 80:8080
    environment:
      DB_NAME: websitedb
      DB_USER: /run/secrets/db_user
      DB_PASSWORD: /run/secrets/db_password
    secrets:
      - db_user
      - db_password
  db:
    image: mongo:latest
    volumes:
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_DATABASE: websitedb
      MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/db_user
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_user
      - db_password
volumes:
  mongo:
secrets:
  db_user:
    file: ./db_user.txt
  db_password:
    file: ./db_password.txt

Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

2 голосов
/ 30 мая 2019

Просматривая руководство по управлению секретами в docker compose , похоже, что все секреты передаются в контейнер в виде файла, смонтированного в /run/secrets/SECRET_NAME, и предлагается передать путь к этому файлу.в качестве переменной среды, а затем прочитайте файл в своем приложении:

При развертывании Docker монтирует файл в / run / secrets / в сервисах.Эти файлы никогда не сохраняются на диске, но управляются в памяти.

Каждый сервис использует переменные среды, чтобы указать, где сервис должен искать эти секретные данные.

Вы передалипуть к этим секретам как process.env.DB_USER, но чтобы получить настоящий секрет, вам нужно прочитать файл:

const fs = require('fs');
const mongoose = require('mongoose');

let dbUser = fs.readFileSync(process.env.DB_USER);
let dbPassword = fs.readFileSync(process.env.DB_PASSWORD);

mongoose.connect(`mongodb://${dbUser}:${dbPassword}@db:27017/${process.env.DB_NAME}`, {useNewUrlParser: true});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...