如何正确设置Keystone.js应用程序以使其在mongo的docker中运行?

时间:2018-09-02 02:26:32

标签: mongodb docker docker-compose keystonejs

我构建了可以在本地正常运行的应用。当我尝试在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

我丢失了一些配置,或者配置不正确。有人可以告诉我那是什么吗?

任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:2)

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

重要的是,每个服务都有自己的带有不同IP的容器。 泊坞窗的美丽之处在于,您无需知道您的容器地址!足以知道您的服务名称:

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,您就可以准备就绪

答案 1 :(得分:0)

几件事可能会有所帮助:

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

...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

答案 2 :(得分:-1)

如果您不希望出现并发症,最好使用mongo db地图集。您可以在本地和部署中使用它。

https://www.mongodb.com/cloud/atlas中可以找到获取mongo网址的简单步骤

然后添加一个env变量 CONNECT_TO = mongodb://您的网址

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

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