Linux stdout stderr如何处理docker容器?

Linux stdout stderr如何处理docker容器?,linux,docker,jenkins,stdout,docker-machine,Linux,Docker,Jenkins,Stdout,Docker Machine,我记得,stdin,stdout&stderr是中文件描述符表的前3个条目 在AWS EC2实例(host1)上,我们有jenkins slave(比如slave container) 从容器由docker客户端组成,该客户端与运行在主机1上的docker守护进程对话 slave container在host1上启动另一个docker容器(比如build container以生成源代码) 下面是从从属容器的管道输出: Running on slave-container in /var/jen

我记得,
stdin
stdout
&
stderr
是中文件描述符表的前3个条目


在AWS EC2实例(
host1
)上,我们有jenkins slave(比如
slave container

从容器
由docker客户端组成,该客户端与运行在主机1上的docker守护进程对话

slave container
host1
上启动另一个docker容器(比如
build container
以生成源代码)

下面是从
从属容器的管道输出:

Running on slave-container in /var/jenkins_home/workspace/abc-app
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Buildabcapp)
[Pipeline] sh
+ docker inspect -f . 111111111110.dkr.ecr.us-east-1.amazonaws.com/someteam/abc-build:7-jdk.x.2
.
[Pipeline] withDockerContainer
slave-container seems to be running inside container 55664444444444444444444444444444444444444444
$ docker run -t -d -u 9000:9000 -w /var/jenkins_home/workspace/abc-app --volumes-from 55664444444444444444444444444444444444444444  111111111110.dkr.ecr.us-east-1.amazonaws.com/someteam/abc-build:7-jdk.x.2 cat
[Pipeline] {
[Pipeline] sh
+ grep -q success
+ echo Yes
+ grep -q success
+ echo Yes
上面的
docker run
命令启动
build container
,该命令运行shell命令,在
从属容器的
stdout
上提供输出:

Running on slave-container in /var/jenkins_home/workspace/abc-app
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Buildabcapp)
[Pipeline] sh
+ docker inspect -f . 111111111110.dkr.ecr.us-east-1.amazonaws.com/someteam/abc-build:7-jdk.x.2
.
[Pipeline] withDockerContainer
slave-container seems to be running inside container 55664444444444444444444444444444444444444444
$ docker run -t -d -u 9000:9000 -w /var/jenkins_home/workspace/abc-app --volumes-from 55664444444444444444444444444444444444444444  111111111110.dkr.ecr.us-east-1.amazonaws.com/someteam/abc-build:7-jdk.x.2 cat
[Pipeline] {
[Pipeline] sh
+ grep -q success
+ echo Yes
+ grep -q success
+ echo Yes


构建容器的stdout/stderr如何显示在
从属容器的stdout上?

Docker引擎公开Docker客户端在运行不同命令时使用的API

在不使用
-d
参数运行
docker run
的特定情况下,客户端使用端点:

POST/containers/create
-用于创建容器

POST/containers/(id或name)/attach
-用于附加到容器并将stdout和stderr流式传输到客户端


有关更多信息,请查看API文档:

Docker引擎公开Docker客户端在运行不同命令时使用的API

在不使用
-d
参数运行
docker run
的特定情况下,客户端使用端点:

POST/containers/create
-用于创建容器

POST/containers/(id或name)/attach
-用于附加到容器并将stdout和stderr流式传输到客户端


有关更多信息,请查看API文档:

出现意外行为的原因是
Jenkins
在实际shell命令之前使用
set-x
运行所有
sh
函数。如果您不熟悉
set-x
,请查看

这可以通过检查
Jenkins
中的
sh
功能来证明,查看:

public String[] buildCommandLine(FilePath script) {
    if(command.startsWith("#!")) {
        // interpreter override
        int end = command.indexOf('\n');
        if(end<0)   end=command.length();
        List<String> args = new ArrayList<>(Arrays.asList(Util.tokenize(command.substring(0, end).trim())));
        args.add(script.getRemote());
        args.set(0,args.get(0).substring(2));   // trim off "#!"
        return args.toArray(new String[0]);
    } else
        return new String[] { getDescriptor().getShellOrDefault(script.getChannel()), "-xe", script.getRemote()};
}
public String[]buildCommandLine(文件路径脚本){
if(command.startsWith(“#!”){
//解释器覆盖
int end=command.indexOf('\n');

如果(end您出现意外行为的原因是
Jenkins
在实际shell命令之前使用
set-x
运行所有
sh
函数。请查看您是否不熟悉
set-x

这可以通过检查
Jenkins
中的
sh
功能来证明,查看:

public String[] buildCommandLine(FilePath script) {
    if(command.startsWith("#!")) {
        // interpreter override
        int end = command.indexOf('\n');
        if(end<0)   end=command.length();
        List<String> args = new ArrayList<>(Arrays.asList(Util.tokenize(command.substring(0, end).trim())));
        args.add(script.getRemote());
        args.set(0,args.get(0).substring(2));   // trim off "#!"
        return args.toArray(new String[0]);
    } else
        return new String[] { getDescriptor().getShellOrDefault(script.getChannel()), "-xe", script.getRemote()};
}
public String[]buildCommandLine(文件路径脚本){
if(command.startsWith(“#!”){
//解释器覆盖
int end=command.indexOf('\n');

如果(endBut在我的例子中…它有
-d
,但在我的例子中…它有
-d
请参见!
{}
与抑制输出无关(此处与您讨论:)。此外,我不想把你所有的东西都整合在一起,然后开始尝试解决问题,我会一步一个脚印地做。詹金斯是这里的重要因素,我相信不是docker。@Convergabot詹金斯在docker容器中运行,所有东西都带有
+
,很可能是因为
詹金斯
而不是
docker
看到了!
{}
与抑制输出无关(正如在这里与您讨论的:)。此外,我不会把你所有的东西都整合在一起,然后开始尝试解决问题,我会一步一个脚印地做。詹金斯是这里的重要因素,而不是我认为的docker。@Convergabot Jenkins在docker容器中运行,所有东西都带有
+
,很可能是因为
詹金斯
而不是
docker
这些命令来自没有jenkins的docker容器…请检查带有image参数的
docker run
命令(
5566444444
)我看到了您正在谈论的行,我仍然认为这与
Jenkins
vs
docker
有关。我认为如果您添加
Jenkins文件的相关部分将非常有用。这些命令来自没有Jenkins的docker容器……请检查带有图像的
docker run
命令rgument(
556644444444444444444444444444
)我看到了你所说的那一行,我仍然认为这与
Jenkins
vs
docker
有关。我认为如果你在
Jenkins文件中添加相关部分将非常有用。