【发布时间】:2020-07-05 03:36:55
【问题描述】:
我对这整个主题很陌生,如果这些问题很愚蠢,请原谅。我想像这样在 Docker 容器中运行单元测试:
- 启动没有表/数据的 Postgres 容器
- 运行 DB 迁移(我使用的是 node-pg-migrate)来创建所有表
- 用测试数据填充数据库
- 使用我的服务启动 Node 容器
- 运行单元测试
- 删除数据库
- 关闭/删除所有容器(出现错误除外)
我目前正在努力运行迁移。我创建了服务图像FROM 我的产品图像和RUN npm install --only=dev。我的docker-compose.yml 看起来像这样:
version: "3.7"
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: test_pw
POSTGRES_USER: test_user
POSTGRES_DB: test_db
ports:
- '5432:5432'
web:
image: docker_tests
environment:
DATABASE_URL: postgres://test_user:test_pw@db:5432/test_db?ssl=false
DATABASE_SSL: "false"
DATABASE_PW: test_pw
DATABASE_USER: test_user
DATABASE_NAME: test_db
DATABASE_HOST: db
depends_on:
- db
ports:
- '1337:1337'
还有我的 Dockerfile:
FROM docker_service
ENV NODE_ENV TEST
WORKDIR /usr/src/app
RUN npm install --only=dev
RUN ["./node_modules/.bin/node-pg-migrate", "up"]
EXPOSE 1337
CMD ["npm", "run", "test"]
运行组合时,两个容器都启动,我什至得到 p>
No migrations to run!
Migration complete!
但是,如果我运行测试,则没有可用的表。迁移未应用于我的 Postgres 容器,并且在迁移后添加 RUN ["printenv"] 时,原因变得很清楚:必要的 DATABASE_URL 不存在。我搜索了一下,发现docker-compose.yml 中指定的环境变量仅在运行时可用,而不是在构建时可用。但是,当我将ENV DATABASE_URL ... 添加到我的 Dockerfile 时,它当然无法连接到数据库,因为 Postgres 容器尚未启动。
我该如何解决这个问题?一种可能的解决方案是在两个容器都启动后立即在 web 中运行 ./node_modules/.bin/node-pg-migrate up,但 Docker 只能有一个 CMD,对吗?我用它来运行我的单元测试。
TL;DR:如何在运行单元测试之前使用 Docker 服务容器中的 node-pg-migrate 在 Docker Postgres 容器中运行迁移?
非常感谢!
【问题讨论】:
标签: postgresql docker docker-compose migration node-pg-migrate