在docker中运行c++二进制文件时缺少输出或输入



使用cmakedocker构建器中构建cpp二进制文件

FROM ubuntu:focal as builder
WORKDIR /var/lib/project
RUN cmake ... && make ...

然后将构建的二进制文件复制到最终镜像(也是ubuntu:focal)到WORKDIR

WORKDIR /var/lib/project
COPY --from=builder /usr/src/project/bin/binary ./binary
EXPOSE 8080
CMD ["./binary"]

运行docker run的docker会挂起docker(即使是-d),没有输入和输出。要阻止码头,我必须从另一个终端杀死它。但是,如果我在它挂起时将exec放入同一个容器中,并从docker内部的shell运行二进制文件,它将按预期工作。

用于构建docker的命令

docker build . --platform=linux/amd64 --file docker/Dockerfile --progress=plain -c 32 -t mydocker:latest

尝试:

CMD ["/bin/bash", "-c" , "./binary"]
CMD ["/bin/bash", "-c" , "exec", "./binary"]

ENTRYPOINT的配置也相同。同样的行为。

我猜二进制文件的构建方式有问题,可能需要一些特定的标志,因为如果我执行docker run ... ls或任何其他内置命令,它将工作并输出到我的stdout。

期望有我的二进制std*重定向到我的std*,就像任何其他命令在docker。

还有一个相关的问题,到目前为止,还没有答案。

更新:主二进制文件是用这些

构建的
CXX_FLAGS= -fno-builtin-memcmp -fPIC -Wfatal-errors -w -msse -msse4.2 -mavx2

更新:主要部分为二进制代码,版本为apache arrow 10.0.1

int main() {
arf::Location srv_loc = arf::Location::ForGrpcTcp("127.0.01", 8080).ValueUnsafe();
arf::FlightServerOptions opt(srv_loc);
auto server = std::make_unique<MyService>();
ARROW_RETURN_NOT_OK(server->Init(opt));
std::printf("Starting on port: %in", server->port());
return server->Serve().ok();
}

更新:问题似乎在这里:

当容器挂起时,我进入它,并做了一个ps aux。二进制得到PID=1,我不知道为什么会发生这种情况,但这几乎不是正确的行为。

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  0.0 341520 13372 ?        Ssl  07:52   0:00 ./binary
root          12  0.5  0.0   4116  3412 pts/0    Ss   07:52   0:00 /bin/bash
root          20  0.0  0.0   5900  2884 pts/0    R+   07:52   0:00 ps aux

更新:./binary是可执行的,chmod +x是无用的。

printfs添加到多个位置不起作用,除非最后一行server->Serve()被注释掉,或者打印的内容非常大,然后所有内容都打印出来。

return语句从server->Server()语句中分离出来没有区别。

更新:

运行docker--init -d标志的构建容器,工作.这是正确的方式吗?如果是这样,如何在dockerfile中强制执行?

这个问题与容器中进程的pid有关。您可以使用——init标志来避免这个问题。欲了解更多信息,请访问此网站- https://docs.docker.com/engine/reference/run/#specify-an-init-process

最新更新