Dockerfile COPY 从镜像到主机
Dockerfile COPY from image to host
我有一个 Dockerfile,其中我首先在一层编译 Mosquitto 服务器,然后使用 COPY 将身份验证插件的源文件复制到映像中,最后 运行 编译该插件-in.
总而言之,生成的图像非常适合在容器中使用,该容器随后会加载该插件的 Mosquitto 服务器 运行。
我想通过重新运行构建Dockerfile来修改这个插件并重新编译它。由于第一层没有修改,所以只是把修改过的文件复制过来,重新运行编译。
我现在要做的是从那个新镜像中提取插件(.so 文件)并将其移动到主机上的挂载目录,这样当前 运行 Mosquitto 服务器将只需要重新启动即可。
是否可以反向使用COPY命令,将编译好的插件复制到指定的宿主目录下,然后删除新建的镜像?
或者这完全是一种糟糕的方法?我是否应该更好地执行 运行 容器并让它重建插件(这将限制我在服务器 运行 所在的机器上构建插件)?
我不知道您正在使用的特定编译器工具的详细信息,但我想我明白您要实现的目标:
我不会在 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
Et voila,容器将 运行 静静地死去,之后您将在 /home/me/my-source-code/dist/result.so
中进行编译
具体细节可能会有很大差异,具体取决于细节,但我希望您能理解:准备好图像中的所有内容,以便执行单个 sh 脚本,编译器从某处获取代码,然后 运行秒。使用该文件夹中的代码安装一个卷。如果编译器在其他地方输出结果,请从您的主机安装另一个卷以在那里获得结果。
COPY 可能不是您想要实现的目标的正确工具。
要么使用运行时卷,就像@gmc 建议的那样,要么使用 docker cp
.
将其复制到主机上
用法
docker cp CONTAINER:SRC_PATH DEST_PATH
但是,我不确定这是不是一般的正确方法。听起来 Docker 不是您想要实现的目标所需的工具。如果你想要一个可变的服务器实例,还有更好的选择。
我有一个 Dockerfile,其中我首先在一层编译 Mosquitto 服务器,然后使用 COPY 将身份验证插件的源文件复制到映像中,最后 运行 编译该插件-in.
总而言之,生成的图像非常适合在容器中使用,该容器随后会加载该插件的 Mosquitto 服务器 运行。
我想通过重新运行构建Dockerfile来修改这个插件并重新编译它。由于第一层没有修改,所以只是把修改过的文件复制过来,重新运行编译。
我现在要做的是从那个新镜像中提取插件(.so 文件)并将其移动到主机上的挂载目录,这样当前 运行 Mosquitto 服务器将只需要重新启动即可。
是否可以反向使用COPY命令,将编译好的插件复制到指定的宿主目录下,然后删除新建的镜像?
或者这完全是一种糟糕的方法?我是否应该更好地执行 运行 容器并让它重建插件(这将限制我在服务器 运行 所在的机器上构建插件)?
我不知道您正在使用的特定编译器工具的详细信息,但我想我明白您要实现的目标:
我不会在 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
Et voila,容器将 运行 静静地死去,之后您将在 /home/me/my-source-code/dist/result.so
具体细节可能会有很大差异,具体取决于细节,但我希望您能理解:准备好图像中的所有内容,以便执行单个 sh 脚本,编译器从某处获取代码,然后 运行秒。使用该文件夹中的代码安装一个卷。如果编译器在其他地方输出结果,请从您的主机安装另一个卷以在那里获得结果。
COPY 可能不是您想要实现的目标的正确工具。
要么使用运行时卷,就像@gmc 建议的那样,要么使用 docker cp
.
用法
docker cp CONTAINER:SRC_PATH DEST_PATH
但是,我不确定这是不是一般的正确方法。听起来 Docker 不是您想要实现的目标所需的工具。如果你想要一个可变的服务器实例,还有更好的选择。