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
vsdocker
有关。我认为如果您添加Jenkins文件的相关部分将非常有用。这些命令来自没有Jenkins的docker容器……请检查带有图像的docker run
命令rgument(556644444444444444444444444444
)我看到了你所说的那一行,我仍然认为这与Jenkins
vsdocker
有关。我认为如果你在Jenkins文件中添加相关部分将非常有用。