我对这门科目还很陌生,所以如果这些是愚蠢的问题,请原谅。我想像这样在Docker容器中运行单元测试:
我目前正在努力进行迁移。我创建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"]
运行合成文件时,两个容器都启动,我什至得到
No migrations to run!
Migration complete!
但是,如果我运行测试,则没有可用的表。迁移未应用于我的Postgres容器,并且RUN ["printenv"]
在迁移后添加时很清楚原因:所需的DATABASE_URL不存在。我在Google上搜索后发现,其中指定的env变量docker-compose.yml
仅在运行时可用,而在构建时不可用。但是,当我添加ENV DATABASE_URL ...
到Dockerfile时,由于Postgres容器尚未启动,因此它当然无法连接到数据库。
我该如何解决这个问题?一种可能的解决方案是,./node_modules/.bin/node-pg-migrate up
在两个容器都启动后立即在Web中运行,但是Docker只能有一个CMD,对吗?我用它来运行我的单元测试。
TL; DR:在运行单元测试之前,如何使用Docker服务容器中的node-pg-migrate在Docker Postgres容器中运行迁移?
非常感谢!
我无法测试,但是这里是这个主意:
docker-entrypoint.sh
在与Dockerfile相同的文件夹中有一个脚本#!/usr/bin/env bash
./node_modules/.bin/node-pg-migrate up
exec "$@"
FROM docker_service
ENV NODE_ENV TEST
WORKDIR /usr/src/app
RUN npm install --only=dev
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh && \
ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 1337
CMD ["npm", "run", "test"]
这样,docker-entrypoint.sh
脚本将在您每次创建容器时执行npm run test
,并且由于会在之后执行exec "$@"
。每个DB映像都有这种设置,我建议您看一下PostgreSQL Dockerfile和入口点脚本。
在执行迁移脚本之前,您可能需要诸如“等待它”之类的内容以确保数据库已启动。depends_on
可以帮助您启动订单,但不要等待服务正常运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句