我对Docker来说还很陌生,但是正在尝试使用docker compose对我的应用程序运行自动化测试。
我设法让docker组成了运行我的应用程序并运行自动化测试的步骤,但是,当我的应用程序在localhost
上运行时,当我需要针对特定域example.com
运行它时
从对docker的研究看来,您应该可以通过在links
中进行设置来在主机名上运行该应用程序,但我似乎仍然无法这样做。
以下是我的docker撰写文件的代码...
docker-compose.yml
abc:
build: ./
command: run container-dev
ports:
- "443:443"
expose:
- "443"
docker-compose.automation.yml
tests:
build: test/integration/
dockerfile: DockerfileUIAuto
command: sh -c "Xvfb :1 -screen 0 1024x768x16 &>xvfb.log && sleep 20 && DISPLAY=:1.0 && ENVIRONMENT=qa BASE_URL=https://example.com npm run automation"
links:
- abc:example.com
volumes:
- /tmp:/tmp/
并且正在使用以下命令来运行...
docker-compose -p tests -f docker-compose.yml -f docker-compose.automation.yml up --build
是否缺少将example.com
映射到localhost
的东西?
答案 0 :(得分:1)
如果两个容器在同一个Docker内部网络上,则Docker将提供DNS服务,其中一个容器可以通过其容器名称与另一个容器进行通信。如您用两个单独的docker-compose.yml
文件所示,这有点棘手,因为Docker Compose希望将每个文件隔离到自己的独立mini-Docker世界中。
第一步是在“第一个” docker-compose.yml
文件中explicitly declare a network。默认情况下,Docker Compose会自动为您创建一个网络,但是您需要控制其名称,以便可以从其他地方引用它。这意味着您需要一个顶级networks:
块,并将容器连接到网络。
version: '3'
networks:
abc:
name: abc
services:
abc:
build: ./
command: run container-dev
ports:
- "443:443"
networks:
abc:
aliases:
- example.com
然后,您可以在测试文件中将其导入为external网络。
version: 3
networks:
abc:
external: true
name: abc
services:
tests:
build: test/integration/
dockerfile: DockerfileUIAuto
command: sh -c "Xvfb :1 -screen 0 1024x768x16 &>xvfb.log && sleep 20 && npm run automation"
environment:
DISPLAY: "1.0"
ENVIRONMENT: qa
BASE_URL: "https://example.com"
networks:
- abc
鉴于您要显示的“测试”容器的复杂性,我强烈建议您不要在Docker中运行它,或者编写一个启动X服务器,检查其是否真正启动然后运行的Shell脚本。考试。 docker-compose.yml
文件不是您在这里拥有的唯一工具。