【问题标题】:Dockerfile COPY from image to hostDockerfile 从镜像复制到主机
【发布时间】:2019-06-27 03:11:00
【问题描述】:

我有一个 Dockerfile,我首先在其中一层编译 Mosquitto 服务器,然后使用 COPY 将身份验证插件的源文件复制到映像中,最后运行该插件的编译。

总而言之,生成的图像非常适合在容器中使用,然后在加载该插件的情况下运行 Mosquitto 服务器。

我想修改这个插件并通过重新运行 Dockerfile 的构建来重新编译它。由于第一层是未修改的,所以它只是复制修改后的文件并再次运行编译。

我现在要做的是从该新映像中提取插件(.so 文件)并将其移动到主机上的挂载目录,这样当前正在运行的 Mosquitto 服务器只需要重新启动即可。

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

或者这完全是一个糟糕的方法?我是否应该更好地执行到正在运行的容器中并让它重建插件(这将限制我在运行服务器的机器上构建插件)?

【问题讨论】:

  • 为什么不使用卷?
  • @gmc 您能否详细说明您指的是哪种卷以及在哪里使用它?服务器在开发机器上运行,因此除了从主机挂载外,没有理由使用任何其他卷,这简化了插件使用的脚本的开发过程。这台开发机器是一台服务器(不是工作站),Mosquitto 服务器应该运行数小时/数天,除非需要重新加载插件(重启 Mosquitto 大约需要一秒钟的停机时间)

标签: docker copy docker-build


【解决方案1】:

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

我不会在 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 脚本,编译器从某处获取代码并运行。使用该文件夹中的代码安装卷。如果编译器将结果输出到其他地方,请从您的主机安装另一个卷以在那里获取结果。

【讨论】:

  • 感谢您的努力。我想我已经接受了需要创建一个容器来获取.so 文件的事实,但是使用docker cp 似乎是一个更好的主意,特别是结合docker create 而不是docker run 因为那里无需执行任何操作。
【解决方案2】:

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

要么使用运行时卷,如 @gmc 建议的那样,要么使用 docker cp 将其复制到主机上。

用法

docker cp CONTAINER:SRC_PATH DEST_PATH

但是,我不确定这是否是正确的方法。听起来 Docker 并不是您想要实现的目标所需的工具。如果你想要一个可变的服务器实例,有更好的选择。

【讨论】:

  • 嘿@Ryan 我正在做一些需要在运行时更改服务器部分的事情,你说If you want a mutable server instance, there are better options.你能告诉我这些选项是什么吗?
  • Ansible、厨师、木偶?尽管仅使用 Docker 来构建/编译工件并不是一个坏主意。但它可能是由 Ansible 之类的东西管理的更大编排的一部分。
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 2018-09-13
  • 2017-04-30
  • 2021-05-24
  • 2020-05-01
  • 2016-01-27
  • 2016-11-08
  • 2018-08-29
相关资源
最近更新 更多