当前位置: 首页 > 知识库问答 >
问题:

测试容器完成时终止docker compose

华振
2023-03-14

我目前正在运行一个docker-comment堆栈,用于与量角器测试运行器、一个服务于网页的nodejs服务器和一个服务于java后端的野飞服务器进行基本集成测试。

堆栈是从我的构建服务器(con课程ci)中的dind(docker中的docker)容器运行的。

但是看起来容器并没有在完成量角器测试后终止。

因此,由于wildfly和NodeJ的容器仍在运行,构建任务从未完成。。。

当测试结束时,我怎样才能让作文以成功或失败告终?

# Test runner
test-runner:
  image: "${RUNNER_IMG}"
  privileged: true
  links:
    - client
    - server
  volumes:
  - /Users/me/frontend_test/client-devops:/protractor/project
  - /dev/shm:/dev/shm
  entrypoint:
    - /entrypoint.sh
    - --baseUrl=http://client:9000/dist/
    - /protractor/conf-dev.js
    - --suite=remember
# Client deployment
client:
  image: "${CLIENT_IMG}"
  links:
    - server
# Server deployment
server:
  image: "${SERVER_IMG}"

共有3个答案

景正文
2023-03-14

我发现最优雅的解决方案是在docker compose中使用dependens\u。yml文件。

services:
  dynamodb:
  ...
  test_runner:
    ...
    depends_on:
      - dynamodb

现在,您可以使用docker-comment run--rmtest_runner来设置依赖项,运行测试,删除所有内容,并传播返回代码

docker-compose run test_runner false
Starting test_dynamodb_1 ... done
echo $?
1
docker-compose run test_runner true
Starting test_dynamodb_1 ... done
echo $?
钱和平
2023-03-14

Compose已将--exit code from{container}标志添加docker Compose up,这使得此操作更加容易。

docker-compose up --exit-code-from test-runner

有关更多详细信息,请参见Michael Spector的答案。

与此rspec q/a类似,您需要将测试作为独立任务运行,并向CI报告退出状态。

您可以将测试运行程序分离到它自己的yaml中,或者将测试运行程序修改为默认为无操作命令/入口点。

单独指定测试运行器配置(您可能需要升级到版本2网络,而不是使用链接跨多个撰写文件工作)。

docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc

测试运行程序默认为无操作入口点/命令,然后手动运行测试命令

services:
  test-runner:
    image: "${RUNNER_IMG}"
    command: 'true'

然后呢

docker-compose up -d
docker-compose run test-runner /launch-tests.sh
rc=$?
docker-compose down
exit $rc

如果您的CI具有“发布任务”的概念,您可能可以跳过rc捕获,在测试运行器CI任务完成后只运行docker compose down。您的CI也可能为您清理容器。

阎星华
2023-03-14

您可以使用这些docker-comact参数来实现:

--abort-on-conport-exout如果任何容器被停止,则停止所有容器。

--exit code from返回所选服务容器的退出代码。

例如,具有这个docker-compose.yml

version: '2.3'

services:
  elasticsearch:
    ...
  service-api:
    ...
  service-test:
    ...
    depends_on:
      - elasticsearch
      - service-api

以下命令确保elasticsearchservice apiservice test完成后关闭,并从service test容器返回退出代码:

docker-compose -f docker-compose.yml up \
    --abort-on-container-exit \
    --exit-code-from service-test
 类似资料:
  • 问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单

  • 问题内容: 我想在控制台上键入: 在终止之前执行脚本。那可能吗? 问题答案: docker stop命令首先尝试通过向容器中的根进程(PID 1)发送SIGTERM信号来停止正在运行的容器。如果该进程在超时时间内仍未退出,则将发送SIGKILL信号。 实际上,这意味着您必须定义一个ENTRYPOINT脚本,该脚本将拦截(捕获)SIGTERM信号并执行适当的任何关闭逻辑。 样本入口点脚本可能如下所示

  • Docker containers are available that contain the complete PX4 development toolchain including Gazebo and ROS simulation: px4io/px4-dev: toolchain including simulation px4io/px4-dev-ros: toolchain incl

  • 只是想知道在我完成输入后如何终止程序?因为在几次“输入”之后扫描仪仍然会继续,假设我要继续输入...我试过了: 和 它们不起作用....程序继续运行,打乱了初衷,

  • 问题内容: 看一下这个人为的例子: 该程序的输出将仅为“ This will print”。goroutine的输出并且不会被发出,因为我想函数线程将在goroutines甚至有机会开始执行之前完成。 使类似的代码在Golang中工作并且不提前终止的惯用方式是什么? 问题答案: 最简单,最干净和“可扩展”的方法是使用: 输出(在Go Playground上尝试): 执行以下操作时要遵循的简单“规则

  • 问题内容: Eclipse在以下代码中给我该警告: 我的代码有什么问题? 问题答案: 从中删除return语句。最终块被认为是清除块,通常不希望在其中返回。