热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dockercompose退出代码应该为非零时似乎为零

我有两个Docker容器:b-db-包含我的数据库b组合

我有两个Docker容器:


  1. b-db -包含我的数据库

  2. b组合-包含我的Web应用程序和在容器启动并运行后运行的测试。

我正在使用docker-compose.yml文件启动两个容器。

version: '3'
services:
db:
build:
context: .
dockerfile: ./docker/db/Dockerfile
container_name: b-db
restart: unless-stopped
volumes:
- dbdata:/data/db
ports:
- "27017:27017"
networks:
- app-network
combined:
build:
context: .
dockerfile: ./docker/combined/Dockerfile
container_name: b-combined
restart: unless-stopped
env_file: .env
ports:
- "5000:5000"
- "8080:8080"
networks:
- app-network
depends_on:
- db
networks:
app-network:
driver: bridge
volumes:
dbdata:
node_modules:

我正在使用Jenkins启动容器并使用以下命令开始运行测试。我正在使用here,here和here的SO帖子概述的--exit-code-from

docker-compose up --build --exit-code-from combined

下面是我的Jenkinsfile的样子。

pipeline {
agent any
environment {
CI = 'true'
}
stages {
stage('Test') {
steps {
sh 'docker-compose up --build --exit-code-from combined'
}
}
}
}

运行我的测试时,b组合似乎按预期退出,并带有非零错误代码,该错误代码显示在控制台上,如下所示。这会触发两个容器都关闭,这也是预期的行为。


  

b组合退出,代码2

  
  

停止b组合...

  
  

停止b-db ...

  
  

停止b-db ...完成在容器出口中终止...

为什么Jenkins仍然显示测试已通过(请参见下面的屏幕截图)?在docker-compose up --build --exit-code-from combined命令非零退出后,詹金斯不应该失败吗?

Docker-compose退出代码应该为非零时似乎为零

此外,当我在本地命令行中(而不是在Jenkins中)运行上述docker-compose命令后立即运行以下命令时,我得到的错误代码为0,这表明问题不在于Jenkins但是使用docker-compose却无法识别出我正在使用非零退出代码退出init.sh

$ echo $?
0

根据@LinPy的以下建议,我在计算机上和Jenkins中本地运行了以下命令。

docker-compose up -d --build db && docker-compose up --build combined || exit 2; echo $?

我收到的输出如下。最后一行是echo $?的输出,它显示脚本仍然以错误代码0退出。

b-combined | Mongoose disconnected
b-combined | TEST ENDED WITH EXIT CODE OF: 2
b-combined | EXITING SCRIPT WITH EXIT CODE OF: 2
b-combined exited with code 2
0

下面是运行上述命令后的詹金斯截图:

Docker-compose退出代码应该为非零时似乎为零

为帮助调试,以下是combineddocker-compose.yml服务的Dockerfile。

RUN npm install
COPY . .
EXPOSE 5000
RUN npm install -g history-server nodemon
RUN npm run build-test
EXPOSE 8080
COPY ./docker/combined/init.sh /scripts/init.sh
RUN ["chmod","+x","/scripts/init.sh"]
ENTRYPOINT [ "/scripts/init.sh" ]

下面是我的init.sh文件中的内容。

#!/bin/bash
# Start front end server
history-server dist -p 8080 &
front_pid=$!
# Start back end server that interacts with DB
nodemon -L server &
back_pid=$!
# Run tests
NODE_ENV=test $(npm bin)/cypress run --config video=false --browser chrome
# Error code of the test
test_exit_code=$?
echo "TEST ENDED WITH EXIT CODE OF: $test_exit_code"
# End front and backend server
kill -9 $front_pid
kill -9 $back_pid
# Exit with the error code of the test
echo "EXITING SCRIPT WITH EXIT CODE OF: $test_exit_code"
exit "$test_exit_code"

以下是我的db服务的Dockerfile。它所做的就是将一些本地数据复制到Docker容器中,然后使用此数据初始化数据库。

FROM mongo:3.6.14-xenial
COPY ./dump/ /tmp/dump/
COPY mongo_restore.sh /docker-entrypoint-initdb.d/
RUN chmod 777 /docker-entrypoint-initdb.d/mongo_restore.sh

下面是mongo_restore.sh中的内容。

#!/bin/bash
# Creates db using copied data
mongorestore /tmp/dump

从@LinPy更新解决方案之后,我尝试了以下步骤。

下面是我的 combined Dockerfile的外观:

RUN npm install
COPY . .
EXPOSE 5000
RUN npm install -g history-server nodemon
RUN npm run build-test
EXPOSE 8080
COPY ./docker/combined/init.sh /scripts/init.sh
RUN ["chmod","/scripts/init.sh"]
ENTRYPOINT [ "/scripts/init.sh" ]
# NEW LINE ADDED HERE
CMD ["sh","-c","exit $(cat /scripts/exit_code)"]

下面是我的 init.sh文件的外观。

#!/bin/bash
# Start front end server
history-server dist -p 8080 &
front_pid=$!
# Start back end server that interacts with DB
nodemon -L server &
back_pid=$!
# Run tests
NODE_ENV=test $(npm bin)/cypress run --config video=false --browser chrome
# Error code of the test
test_exit_code=$?
echo "TEST ENDED WITH EXIT CODE OF: $test_exit_code"
# End front and backend server
kill -9 $front_pid
kill -9 $back_pid
# NEW LInes ADDED HERE
echo "$test_exit_code" > /scripts/exit_code
exec "$@"
# Exit with the error code of the test
echo "EXITING SCRIPT WITH EXIT CODE OF: $test_exit_code"
exit "$test_exit_code"

最后,我运行了以下命令:

docker-compose up -d --build db && docker-compose up --build combined || exit 2; echo $?

输出如下-最后一行(来自echo $?的输出)的退出代码为0。

b-combined | TEST ENDED WITH EXIT CODE OF: 2 ===========================
b-combined exited with code 2
0

解决方案:

我使用的是较早版本的docker-compose(低于v1.23.0)。正如您在docker-compose的release notes中所看到的那样,自v1.23.0起,--exit-code-from周围有一些错误修复。


我认为您的命令应该是:

docker-compose up --build --exit-code-from combined combined

通过这种方式,您将从combined获得退出代码

因为combined服务依赖于db,而该服务也将启动db服务。

我认为退出代码始终为0,因为--exit-code-from暗示着--abort-on-container-exit,而db将在退出时返回0

--abort-on-container-exit Stops all containers if any container was
stopped. Incompatible with -d. ...
--exit-code-from SERVICE Return the exit code of the selected service
container. Implies --abort-on-container-exit.

更新

尝试将其添加到脚本中,以代替最后一行:

#!/bin/bash
# Start front end server
history-server dist -p 8080 &
front_pid=$!
# Start back end server that interacts with DB
nodemon -L server &
back_pid=$!
# Run tests
NODE_ENV=test $(npm bin)/cypress run --config video=false --browser chrome
# Error code of the test
test_exit_code=$?
echo "TEST ENDED WITH EXIT CODE OF: $test_exit_code"
# End front and backend server
kill -9 $front_pid
kill -9 $back_pid
# Exit with the error code of the test
echo "EXITING SCRIPT WITH EXIT CODE OF: $test_exit_code"
echo "$test_exit_code" > /scripts/exit_code
exec "$@"

然后在您的Dockerfile中添加一个CMD

CMD ["sh","-c","exit $(cat /scripts/exit_code)"]

运行

docker-compose up --build --exit-code-from combined combined

,

如评论中所述,我无法通过简单的撰写文件来重现您的问题。如果下面的示例仍然为您提供退出代码0,则安装docker-compose可能会出现问题。并且,如果工作正常,那么问题将出在您的容器实际上没有以正确的退出代码退出。您还应该运行docker container ls -a来查看退出的容器及其退出代码,并在已停止的容器上运行docker logs来验证输出。这是我的工作示例:

$ cat docker-compose.exit-code.yml
version: '3'
services:
good:
image: busybox
command: /bin/sh -c "exit 0"
bad:
image: busybox
command: /bin/sh -c "exit 42"
$ docker-compose -f docker-compose.exit-code.yml up --exit-code-from bad
Starting test_good_1_69c61ee0bdc6 ... done
Starting test_bad_1_fbe3194c1994 ... done
Attaching to test_bad_1_fbe3194c1994,test_good_1_69c61ee0bdc6
test_bad_1_fbe3194c1994 exited with code 42
Aborting on container exit...
$ echo $?
42
$ docker-compose -f docker-compose.exit-code.yml up --exit-code-from good
Starting test_good_1_69c61ee0bdc6 ... done
Starting test_bad_1_fbe3194c1994 ... done
Attaching to test_good_1_69c61ee0bdc6,test_bad_1_fbe3194c1994
test_good_1_69c61ee0bdc6 exited with code 0
Aborting on container exit...
$ echo $?
0

推荐阅读
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • Docker 自定义网络配置详解
    本文详细介绍如何在 Docker 中自定义网络设置,包括网关和子网地址的配置。通过具体示例展示如何创建和管理自定义网络,以及容器间的通信方式。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
author-avatar
老娘叫凌凌_523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有