我在docker-compose容器中使用Knex js迁移时遇到问题。 问题是npm run db(knex migration:rollback && knex migration:latest && knex seed:run)会在数据库创建之前立即运行。无论如何,创建数据库后我只想运行npm run db吗?
注意:如果我在docker终端上执行此npm命令,则在构建后一切正常。只是
这是我的docker-compose.yml
version: '3.6'
services:
#Backend api
server:
container_name: server
build: ./
command: npm run db
working_dir: /user/src/server
ports:
- "5000:5000"
volumes:
- ./:/user/src/server
environment:
POSTGRES_URI: postgres://test:test@192.168.99.100:5432/interapp
links:
- postgres
# PostgreSQL database
postgres:
environment:
POSTGRES_USER: test
POSTGRES_PASSWORD: test
POSTGRES_DB: interapp
POSTGRES_HOST: postgres
image: postgres
ports:
- "5432:5432"
这是我的Dockerfile
FROM node:10.14.0
WORKDIR /user/src/server
COPY ./ ./
RUN npm install
CMD ["/bin/bash"]
答案 0 :(得分:0)
只需在服务器服务中添加depends_on
即可解决问题。
services:
server:
depends_on:
- postgres
...
这将导致docker-compose在服务器容器之前启动postgres容器。但是它不会等待postgres准备好。在这种情况下,应该没问题,因为postgres的启动速度非常快。
如果您想要更坚固的东西,或者depends_on
不能解决问题,则可以将入口点包装脚本添加到容器中。请参阅https://docs.docker.com/compose/startup-order/,在这里您可以了解更多信息。也有指向工具的链接,因此您不必从头开始编写自己的脚本。
答案 1 :(得分:0)
在docker-compose.yml文件中,使用sh(bash)包含要在其中运行命令的环境上下文。 sh -c'npm运行数据库' 您的docker-compose文件现在将是 其次,使用depends_on步骤等待数据库启动
services:
#Backend api
server:
container_name: server
build: ./
command: sh -c 'npm run db'
working_dir: /user/src/server
depends_on:
-postgres
ports:
- "5000:5000"
volumes:
- ./:/user/src/server
environment:
POSTGRES_URI: postgres://test:test@192.168.99.100:5432/interapp
links:
- postgres