2017-03-31 27 views
1

我有一个编译为二进制文件的项目,运行该二进制文件公开了一些REST API。编译并运行在不同的容器

要编译项目,我需要docker image A,它有编译器和生成可执行文件所需的所有库。要运行可执行文件(即托管服务),我可以使用更小的映像B(只需基本的Linux发行版,不需要编译器)。

如何使用码头工人是这样的情况?

+0

居于容器中您可以使用运行的源代码容器的容积一个简单的脚本构建它,然后复制可执行文件并构建映像,但Docker无法在一步之内完成此操作。 – Julian

+1

取决于您的构建链。如果你没有使用任何其他外部工具,我会使用源代码所在的主机卷,运行构建并将二进制文件备份到运行映像中。 – opHASnoNAME

回答

1

我对这种情况下的想法是,你可以准备两个基本的图像:

  • 一日一,其中包括编译器和所有库建立可执行文件,称它为base-image:build
  • 第二届之一,基本映像建立你的最终图像传送,称之为base-image:runtime

然后打破你的构建过程分为两个步骤:

  • 步骤1:在base-image:build内部构建您的可执行文件,然后将您的executable放到某个位置,例如NFS或任何注册表,以便以后使用它们;
  • 步骤2:编写您的Dockerfile其中FROM base-image:runtime,从您的投递图像生成的任何地方获取您的神器/可执行文件,然后将docker push发送到您的注册表以供发布。

希望这可帮助:-)

1
mkdir local_dir 
docker run -dv $PWD/local_dir:/mnt BUILD_CONTAINER 

编译代码,并保存到/ mnt在容器中。它将被写入您的主机文件系统的local_dir,并在容器被销毁后保留。

您现在应该编写一个Dockerfile并添加一个步骤来复制新的二进制文件,然后构建。但对于例如起见...

docker run -dv $PWD/local_dir:/mnt PROD_CONTAINER 

你的bin,一切都在local_dir否则,将在/mnt/