使用cmake
在docker
构建器中构建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
是无用的。
将printf
s添加到多个位置不起作用,除非最后一行server->Serve()
被注释掉,或者打印的内容非常大,然后所有内容都打印出来。
将return
语句从server->Server()
语句中分离出来没有区别。
更新:
运行docker--init -d
标志的构建容器,工作.这是正确的方式吗?如果是这样,如何在dockerfile
中强制执行?
这个问题与容器中进程的pid有关。您可以使用——init标志来避免这个问题。欲了解更多信息,请访问此网站- https://docs.docker.com/engine/reference/run/#specify-an-init-process