【问题标题】:How to identify why a program is not starting inside docker如何确定程序未在 docker 内启动的原因
【发布时间】:2020-10-02 22:46:19
【问题描述】:

我有一个 docker 映像,其中包含一个包含依赖项的 c++ 可执行文件。这个可执行文件在 docker 环境之外运行良好,我已经对其进行了多次测试。 但是在 docker 内部,它会在启动时立即停止。

为了调试,我在调用 main() 函数后立即添加了 std::cout << "Main 1" << std::endl。但是,当我在 docker 中启动可执行文件时,即使这也没有被打印出来。

有关如何调试此问题的任何提示。

添加用于构建 docker 镜像的 docker 文件。

FROM ubuntu:18.04

# install app dependencies
RUN apt-get -yqq update \
        && apt-get -yqq dist-upgrade \
        && apt-get -yqq install apt-utils libgomp1 libprotobuf10 libboost-thread1.65.1 libboost-filesystem1.65.1 libopencv-core3.2 libopencv-imgproc3.2 libopencv-imgcodecs3.2 libjpeg-turbo8 libpo
        && apt-get -yqq remove systemd cups perl ffmpeg apt-utils \
        && rm -rf /var/lib/apt/lists/*

# create app folder
RUN mkdir -p /opt/aimes

# copy app, dependencies and config
COPY deps/aimes /opt/aimes/
COPY deps/*.* /opt/aimes/
COPY deps/config /opt/aimes/config

# copy wrapper script
COPY run-es.sh /opt/aimes/

# run command
WORKDIR /opt/aimes
ENV LD_LIBRARY_PATH .
ENTRYPOINT ["./run-es.sh"]

【问题讨论】:

  • 我可以在 docker 中运行 cat 或 ls -al 之类的命令。我可以看到所有文件。甚至可执行文件上的 ldd 也返回所有链接库,我在该列表中看不到任何 not found
  • 我已经用用于准备 docker 镜像的 Dockerfile 更新了这个问题。
  • 查看stackoverflow.com/questions/42029834/…了解如何使用gdb
  • 感谢 Alan,帮助我找出问题所在。
  • 如果你已经解决了你的问题,你可以回答你自己的问题来帮助其他人

标签: c++ docker


【解决方案1】:

将 --cap-add=SYS_PTRACE 添加到 docker run 命令有助于找出使用 gdb 的问题。

另外解决方案是将上述选项添加到 docker run 命令,因为 exe 需要 root 权限。

以下命令解决了我的问题。

docker run --cap-add=SYS_PTRACE -it --rm

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2017-05-24
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多