从映像到主机的Dockerfile COPY

时间:2019-02-02 22:33:05

标签: docker copy docker-build

我有一个Dockerfile其中我首先编译Mosquitto服务器在一个层中,然后用COPY到插件的认证的源文件拷贝到图像最后运行该插件的汇编

总而言之,生成的图像很适合在容器中使用,然后容器中装有运行该插件的Mosquitto服务器。

我想修改此插件并通过重新运行Dockerfile的构建来重新编译它。由于第一层未修改,因此它仅复制修改后的文件并再次运行编译。

我想现在要做的是提取插件从该新的图像(.so文件),并将其移动到一个安装在主机上的目录,使当前正在运行的服务器Mosquitto只需要重新启动。

是否可以反向使用COPY命令,以便将编译后的插件复制到指定的主机目录中,以便随后我可以删除新创建的映像?

或者这是一个不错的办法干脆?我是否应该更好地执行到正在运行的容器中,并让它重新构建插件(这将使我局限于在运行服务器的计算机上构建插件)?

2 个答案:

答案 0 :(得分:3)

我不知道您正在使用的特定编译器工具的详细信息,但我想我知道您正在尝试实现的目标:

我不会在Dockerfile中包含COPY命令。 Dockerfile必须仅包含必要的指令,以具有具有执行编译过程所需的工具和依赖项的映像,并且可能包含具有特定编译顺序的shell脚本。

现在您运行docker build并拥有图像,我们将其称为mosq。假设:

  • 您在/home/me/my-source-code的本地计算机中拥有源代码
  • 编译完成后,结果将保存在该文件夹的子文件夹dist中:/home/me/my-source-code/dist/result.so
  • 您的图像具有脚本/compile.sh,该脚本可编译/compilation中存在的源代码(该文件夹在图像中应该为空)

然后,将图像安装体积参数/home/me/my-source-code运行到容器内部的/compilation

假设所有上述几点,docker run命令应类似于:

docker run -d --name my-compiler -v /home/me/my-source-code:/source mosq /compile.sh

等等,容器将以静默方式运行并死亡,然后,您将在/home/me/my-source-code/dist/result.so中编译

具体细节可能会有所不同,具体取决于细节,但是我希望您能理解:准备映像中的所有内容,以便执行单个sh脚本,编译器从某个地方获取代码并运行。使用该文件夹中的代码挂载卷。如果编译器将结果输出到其他地方,请从主机上装入另一个卷以在那里获得结果。

答案 1 :(得分:0)

COPY可能不是您要实现的目标的正确工具。

使用@gmc建议的运行时卷,或使用docker cp将其复制到主机上。

用法

docker cp CONTAINER:SRC_PATH DEST_PATH

但是,我不确定总体上这是正确的方法。听起来并不是Docker是您想要实现的工具。如果您希望使用可变服务器实例,则有更好的选择。