【问题标题】:Add your application to a Docker image将您的应用程序添加到 Docker 映像
【发布时间】:2016-04-25 06:03:48
【问题描述】:

我正在实现一个 docker 容器来编译(构建)我的 C++ 代码。我的代码支持的平台是 Windows、Linux 和 Mac OSX。

我在我的 Mac 机器上使用 clang 来编译代码; Linux 上的 gcc 和 Windows 上的 Microsoft 编译器 (cl)。这个想法是创建一个 Docker 容器并在 Windows 机器本身(在 docker 容器内)上执行构建(Linux 和 Mac),这样我就不必将代码推送到 git;然后从我的 Mac 机器上拉出来,然后构建等等。

我用于执行 Mac 构建的映像(因为我在 Mac OSX 上使用 clang)是 https://hub.docker.com/r/rsmmr/clang/

我想为这个图像添加一个可执行文件,用于测试目的。它被称为“testapp”。

因此图像应具有以下组件: 基础操作系统 + Clang + testapp。

如何将我的可执行文件“testapp”(例如:application/utlity)添加到这个图像“rsmmr/clang”(我从 dockerhub 中提取)?

我是否通过 Dockerfile 执行此操作(如何?)? 有没有其他方法可以做到这一点?

【问题讨论】:

    标签: macos docker clang dockerfile docker-image


    【解决方案1】:

    解决此问题的一种简单方法是将您的源/二进制 testapp 安装到 clang 图像。

    为了证明这一点,我自己创建了一个 testapp.cc,它看起来像这样:

    [anovil@ubuntu-anovil add_application_docker_image]$ cat testapp.cc 
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World!" << endl;
        return 0;
    }
    [anovil@ubuntu-anovil add_application_docker_image]$ 
    

    然后,通过将我的本地目录传递给容器并运行如下编译命令来启动 rsmmr/clang 容器:

    [anovil@ubuntu-anovil add_application_docker_image]$ docker run -v $(pwd):/mnt -it rsmmr/clang /opt/llvm/bin/clang++ --std=c++11 --stdlib=libc++ /mnt/testapp.cc -o /mnt/a.out
    [anovil@ubuntu-anovil add_application_docker_image]$ 
    

    在此之后,a.out 将位于您的本地目录中(因为它已安装到容器中)。

    [anovil@ubuntu-anovil add_application_docker_image]$ ls
    a.out  testapp.cc
    [anovil@ubuntu-anovil add_application_docker_image]$ 
    

    如果您想在容器内执行该二进制文件,您也可以这样做。

    [anovil@ubuntu-anovil add_application_docker_image]$ docker run -v $(pwd):/mnt -it rsmmr/clang /mnt/a.out
    Hello World!
    [anovil@ubuntu-anovil add_application_docker_image]$ 
    

    你也可以用其他编译器做类似的事情。我没有Windows机器,但它应该可以工作:) 你想要这样的东西吗?

    让我知道进展如何。

    谢谢,

    • 阿努普

    【讨论】:

    • 感谢您的意见 :)
    • 我想要的是 'a.out' 成为图像的一部分。我已经做好了'a.out'。现在,我想将 a.out 与这个 docker 映像集成;这样,当我将此图像带到另一台机器并运行此图像以创建容器时;我在这个容器中有一个可用的 a.out。
    【解决方案2】:

    如果您愿意,您可以通过创建自己的 Dockerfile 并制作自己的映像来做到这一点。

    启动你的 Dockerfile

    FROM install-clang
    

    然后添加你需要的。

    COPY a.out directoryinthecontainer/
    

    如果您需要在创建图像期间采取进一步措施,请使用

    RUN apt-get morepackage && execute mycommand && unpack somefile.tar
    

    您明白了:这些可以是您喜欢的任何操作系统命令。 如果您希望该应用程序作为新图像的核心部分运行,请添加

    ENTRYPOINT ["directoryinthecontainer/a.out", "-myoptions"]
    

    CMD ["directoryinthecontainer/a.out", "-myoptions"]
    

    在使用 ENTRYPOINT、RUN 或 CMD 时存在细微差别,这取决于您的用例。

    查看Dockerfile Reference 了解哪一个可以满足您的需求。

    编辑:我想我会澄清下一步:

    使用你的 Dockerfile 创建你自己的镜像

    docker build -t myrepo/myimage:mytag .
    

    别忘了'.' (句点)在命令行的末尾!

    从那时起,您可以使用自己的映像创建一个容器,该容器将完成原始 CLANG 的所有功能以及您的附加功能。这是我最喜欢的功能之一! :)

    【讨论】:

    • 感谢您的意见 :)。我会进一步探索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2020-01-21
    • 1970-01-01
    • 2020-01-15
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多