Docker无法启动cpp应用程序

时间:2018-09-19 16:02:29

标签: c++ docker dockerfile

我试图在docker中运行cpp应用程序。构建executable并创建Dockerfile后,由于某种原因,我无法在docker内部运行它:

main.cpp

#include<iostream>
#include<chrono>
#include<thread>
#include<string>
#include <unistd.h>

int main(int argc,char *argv[])
{
    std::cout<<"Started daemon..."<<std::endl;
    std::string hostString(argv[1]);
    std::cout<<"HostName:"<<hostString<<std::endl; 
    std::cout<<"Port:"<<std::stoi(argv[2])<<std::endl;
    int i=0;
    while(true){
      std::cout<<"Iterations:"<<i++<<std::endl;
      std::this_thread::sleep_for (std::chrono::seconds(1));
      if(i++>10000) i=0;
    }
    return 0; 
}

Dockerfile

FROM  ubuntu:latest
RUN mkdir -p /home/dockerc
COPY . /home/dockerc
ENTRYPOINT ["/home/dockerc/main","127.0.0.1","8350"]

dockerc文件夹

  • main.cpp
  • main.exe
  • Dockerfile

我运行以下命令:
g++ main main.cpp
 docker build app .
 docker images(表明已创建app图片)
 docker run app

构建成功,但是当我按下run时,它似乎被阻止了。只是没有继续。

enter image description here

怎么了?有人可以帮我吗?我是docker的新手。

PS 等待10分钟后,我收到一则长的错误消息,该错误消息以以下内容开头:

$ docker run cpapp
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: container a575e463f193dbc475aab78c1810486e23981a50c                                                           0b731f9c891c4143d0ed5b3 encountered an error during CreateProcess: failure in a Windows system call: The compute system exited unexpecte                                                                                                                                       dly. (0xc0370106)

2 个答案:

答案 0 :(得分:2)

您应将完整路径放入ENTRYPOINT并将参数添加到程序中。

此Dockerfile可以完成工作:

FROM  ubuntu:latest
RUN mkdir -p /home/dockerc
COPY . /home/dockerc
ENTRYPOINT ["/home/dockerc/main", "hostname", "8000"]

用所需的主机名和端口替换hostname8000

修改

我在Linux上测试了您的程序,要使其运行,我必须:

1)为c ++ 11编译(由于chrono

2)添加-t以构建docker应用

这是要运行的命令的完整列表:

g++ -o main main.cpp -std=c++11
docker build -t app .
docker run app

这是输出:

bash output

答案 1 :(得分:1)

RUN cd...代替WORKDIR ...

您的CD在这种情况下不是您所期望的,并且在下一行被忘记了

您还可以删除RUN cd...行并将整个路径放入

ENTRYPOINT