如何将dotnet核心应用程序的退出代码从docker容器中传递出去

如何将dotnet核心应用程序的退出代码从docker容器中传递出去,docker,.net-core,docker-compose,Docker,.net Core,Docker Compose,这不再是一个问题 该问题很可能是由Visual Studio中的某些缓存问题引起的。 通过重新创建解决方案并重新添加Docker支持,修复了此问题 ========================================================================= 我有一个小型的dotnet核心应用程序,它应该可以帮助进行端到端测试 为了能够将它与我们的CI管道集成,我将它放在一个docker容器中 到目前为止,一切都进展顺利 现在的问题是docker容器不会以与应

这不再是一个问题

该问题很可能是由Visual Studio中的某些缓存问题引起的。 通过重新创建解决方案并重新添加Docker支持,修复了此问题

=========================================================================

我有一个小型的dotnet核心应用程序,它应该可以帮助进行端到端测试

为了能够将它与我们的CI管道集成,我将它放在一个docker容器中 到目前为止,一切都进展顺利

现在的问题是docker容器不会以与应用程序相同的代码退出

我假设这是因为应用程序是由dotnet运行时封装的,因此即使应用程序以非零代码退出,实际的入口点(
dotnet
)也是在
Dockerfile
中定义的

ENTRYPOINT ["dotnet", "DataComparerCli.dll"]
退出时使用
0x0
,这是用作容器的退出代码

我试图通过让应用程序将其退出代码存储在一个环境变量中,并创建一个shell脚本作为入口点,然后依次调用dotnet并使用应用程序的退出代码作为自己的退出代码来解决这个问题,但这目前失败了

#!/bin/bash

dotnet /app/path/to/dll/DataComparerCli.dll
exit $DataComparerExitCode

感觉就像我在使用一根(断了的)拐杖,这就是为什么我不能让它工作的原因

这是一种很好的方法吗?我只是对bash脚本有问题,还是有更好的方法让它工作

更新 显然,目前(版本3.1预览版)不可能设置在mac和linux上比应用程序寿命长的环境变量:
Docker始终返回已执行进程的退出代码,除非检测到与守护进程本身相关的其他错误。这意味着
dotnet DataComparerCli.dll
应该返回正确的退出代码

125: docker run itself fails
126: contained command cannot be invoked
127: if contained command cannot be found
128 + n Fatal error signal n:
130 = (128+2) Container terminated by Control-C
137 = (128+9) Container received a SIGKILL
143 = (128+15) Container received a SIGTERM
问题可能是您运行容器的方式。你是怎么做到的?如果使用分离模式
-d
,则进程的退出代码将始终为0

例如:

$ docker run busybox /bin/sh -c 'exit 3' 
$ echo $?
# 3
$ docker run -d busybox /bin/sh -c 'exit 3'
$ echo $?
# 0

Docker始终返回已执行进程的退出代码,除非检测到与守护进程本身相关的其他错误。这意味着
dotnet DataComparerCli.dll
应该返回正确的退出代码

125: docker run itself fails
126: contained command cannot be invoked
127: if contained command cannot be found
128 + n Fatal error signal n:
130 = (128+2) Container terminated by Control-C
137 = (128+9) Container received a SIGKILL
143 = (128+15) Container received a SIGTERM
问题可能是您运行容器的方式。你是怎么做到的?如果使用分离模式
-d
,则进程的退出代码将始终为0

例如:

$ docker run busybox /bin/sh -c 'exit 3' 
$ echo $?
# 3
$ docker run -d busybox /bin/sh -c 'exit 3'
$ echo $?
# 0

它应该是进程的退出状态,因为docker exit code中没有类似于
0x0
的代码,所以返回
0x0
的是dotnet。您可以查看这些链接

这是docker退出代码的列表

125: docker run itself fails
126: contained command cannot be invoked
127: if contained command cannot be found
128 + n Fatal error signal n:
130 = (128+2) Container terminated by Control-C
137 = (128+9) Container received a SIGKILL
143 = (128+15) Container received a SIGTERM

下面是使用nodejs进行复制的最简单方法

FROM node:alpine
COPY . /app
WORKDIR /app
RUN chmod +x /app/start.sh
entrypoint /app/start.sh
start.sh

#!/bin/sh
node start.js
js脚本

let exitCode = 45;
console.log("server is going to shutdown");
process.exit(exitCode)

所以我可以看到正确的代码


因此,该问题与docker无关,而是dotnet进程本身。

它应该是进程的退出状态,因为docker退出代码中没有类似于
0x0
的代码,所以返回
0x0
的是dotnet。您可以查看这些链接

这是docker退出代码的列表

125: docker run itself fails
126: contained command cannot be invoked
127: if contained command cannot be found
128 + n Fatal error signal n:
130 = (128+2) Container terminated by Control-C
137 = (128+9) Container received a SIGKILL
143 = (128+15) Container received a SIGTERM

下面是使用nodejs进行复制的最简单方法

FROM node:alpine
COPY . /app
WORKDIR /app
RUN chmod +x /app/start.sh
entrypoint /app/start.sh
start.sh

#!/bin/sh
node start.js
js脚本

let exitCode = 45;
console.log("server is going to shutdown");
process.exit(exitCode)

所以我可以看到正确的代码


因此,这个问题与docker无关,而是与dotnet进程本身有关。

任何应用程序都不可能设置一个超出其自身进程的环境变量。“环境变量”中的“环境”部分指的是进程及其子进程的环境。你能用hello world风格的应用程序来试试吗?仅执行
环境。在
Main
中退出(1)
。请包括整个项目文件、源代码dockerfile以及您如何构建和运行dockerfile。我做了,令人不安的事实是,MCVE做了我想要的。docker容器在
Environment.Exit()中以硬编码值退出。我想我必须重新构建整个解决方案。逐步添加我的文件,然后重做Docker和Compose支持:(任何应用程序都不可能设置一个超出其自身流程的环境变量。环境变量的“环境”部分指进程及其子进程的环境。您可以使用hello world样式的应用程序尝试此操作吗?仅执行
环境。退出(1)
Main
中。请包括整个项目文件、源代码dockerfile以及您如何构建和运行dockerfile。我做了,令人不安的事实是,MCVE做了我想要的。docker容器在
环境中以硬编码值退出。退出()
。我想我必须重建整个解决方案。逐步添加我的文件,然后重做Docker和Compose支持:(