我构建了可以在本地正常运行的应用。当我尝试在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
我丢失了一些配置,或者配置不正确。有人可以告诉我那是什么吗?
任何帮助将不胜感激。
谢谢!
答案 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