【问题标题】:How do I properly set up my Keystone.js app to run in docker with mongo?如何正确设置我的 Keystone.js 应用程序以使用 mongo 在 docker 中运行?
【发布时间】:2019-02-07 13:15:34
【问题描述】:

我已经构建了在本地运行良好的应用程序。当我尝试在 docker (docker-compose up) 中运行它时,它似乎已启动,但随后会引发错误消息:

Creating mongodb ... done
Creating webcms  ... done
Attaching to mongodb, webcms

...

Mongoose connection "error" event fired with:
    MongoError: failed to connect to server [localhost:27017] on first connect

...

webcms exited with code 1

我已经阅读了 Keystone.js 您需要在 .env 文件中配置 Mongo 位置,我有:

MONGO_URI=mongodb://localhost:27017

这是我的 Docker 文件:

# Use node 9.4.0
FROM node:9.4.0

# Copy source code
COPY . /app

# Change working directory
WORKDIR /app

# Install dependencies
RUN npm install

# Expose API port to the outside
EXPOSE 3000

# Launch application
CMD ["node","keystone"]

...还有我的 docker-compose

version: "2"
services:
  # NodeJS app
  web:
    container_name: webcms
    build: .
    ports:
    - 3000:3000
    depends_on:
    - mongo

  # MongoDB
  mongo:
    container_name: mongo
    image: mongo
    volumes:
      - ./data:/data/db/mongo
    ports:
      - 27017:27017

当我运行 docker ps 时,它确认 mongo 已启动并在容器中运行...

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
f3e06e4a5cfe        mongo               "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:27017->27017/tcp   mongodb

我要么缺少某些配置,要么配置不正确。谁能告诉我那是什么?

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: mongodb docker docker-compose keystonejs


    【解决方案1】:

    它无法正常工作,因为您发送了错误的主机。 您的容器不知道 localhost:27017 是什么,因为它是您的计算机地址,而不是它的容器地址。

    重要的是要了解每个服务都有自己的具有不同 IP 的容器。 docker-compose 的美妙之处在于你不需要知道你的容器地址!足以知道您的服务名称:

    version: "2"
    
    volumes:
      db-data:
        driver: local
    
    services:
      web:
        build: .
        ports:
          - 3000:3000
        depends_on:
          - mongo
        environment:
          - MONGO_URI=mongodb://mongo:27017
    
      mongo:
        image: mongo
        volumes:
          - "db-data:/data/db/mongo"
        ports:
          - 27017:27017
    

    只需运行docker-compose up,一切就绪

    【讨论】:

    • 使用这种方式将在项目文件中创建数据。如何将 mongodb DB 存储到 ubuntu 外部文件夹中。为了避免被删除。
    【解决方案2】:

    几件事可能会有所帮助:

    首先。我不确定您的错误日志是什么样的,但隐藏在我的错误日志中的是:

    ...Error: The cookieSecret config option is required when running Keystone in a production environment.Update your app or environment config so this value is supplied to the Keystone constructor....

    要解决此问题,请在您的 Keystone 入口文件(例如:index.js)中确保您的 Keystone 构造函数正确设置了 cookieSecret 参数:process.env.NODE_ENV === 'production'

    接下来。将 mongo uri 从生成的 Keystone (mongoUri: mongodb://localhost/my-keystone) 更改为:mongoUri: 'mongodb://mongo:27017'。 Docker 需要这个,因为它是 mongo 容器地址。此更改也应反映在 MONGO_URI 下环境变量下的 docker-compose 文件中:

    ... environment: - MONGO_URI=mongodb://mongo:27017 ...

    在这些更改之后,您的 Keystone 构造函数应如下所示:

    const keystone = new Keystone({
      adapter: new Adapter(adapterConfig),
      cookieSecret: process.env.NODE_ENV === 'production',
      sessionStore: new MongoStore({ url: 'mongodb://mongo:27017' }),
    });
    

    还有你的 docker-compose 文件,类似这样的(我使用网络而不是链接作为我的 docker-compose 的链接,因为 Docker 已经声明 links 是一个遗留选项。我已经包含了我的,以防它对任何人有用否则):

    version: "3.3"
    services:
      mongo:
          image: mongo
          networks:
           - appNetwork
          ports:
           - "27017:27017"
          environment:
           - MONGO_URI=mongodb://mongo:27017
      appservice:
          build:
            context: ./my-app
            dockerfile: Dockerfile
          networks:
            - appNetwork
          ports:
            - "3000:3000"
    networks:
     appNetwork:
       external: false
    

    【讨论】:

      【解决方案3】:

      如果您不想复杂化,最好使用 mongo db atlas。您可以在本地和部署中使用它。

      https://www.mongodb.com/cloud/atlas中提供了获取mongo url的简单步骤

      然后添加一个环境变量 CONNECT_TO=mongodb://your_url

      要将 .env 传递给 docker,请使用

      docker run --publish 8000:3000 --env-file .env --detach --name kb keystoneblog:1.0
      

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 2016-02-06
        • 2016-06-29
        相关资源
        最近更新 更多