将主机中的空文件夹装载到Docker中的非空文件夹

将主机中的空文件夹装载到Docker中的非空文件夹,docker,Docker,我正在使用的工具以Docker图像的形式提供。由于安装该工具非常复杂,并且有一系列依赖项,因此我希望使用IDE在主机上工作,但在容器上运行它 因此,在下载并加载图像后,我运行: sudo docker run -it -v /home/myself/WIP/thetool:/home/thetool name/label 如果没有安装,工具位于/home/tool下,但是如果安装,此文件夹为空(因为主机中的文件夹为空) 我是否需要从容器中复制工具,然后将其装载,或者有一种方法可以直接执行此操作

我正在使用的工具以Docker图像的形式提供。由于安装该工具非常复杂,并且有一系列依赖项,因此我希望使用IDE在主机上工作,但在容器上运行它

因此,在下载并加载图像后,我运行:

sudo docker run -it -v /home/myself/WIP/thetool:/home/thetool name/label
如果没有安装,工具位于
/home/tool
下,但是如果安装,此文件夹为空(因为主机中的文件夹为空)


我是否需要从容器中复制工具,然后将其装载,或者有一种方法可以直接执行此操作。

对于这一点,主机卷的设计是将文件从主机注入容器,并允许您从容器外部管理文件

您可以将工具作为容器入口点的一部分从容器中复制出来,但是您需要将卷装载到与容器中目录不同的位置,以便使源目录和目标目录都可用。此示例的入口点如下所示:

#!/bin/sh

if [ ! -d "/data" ]; then
  ln -s /data_save /data
elif [ -z "$(ls -A /data)" ]; then
  cp -a /data_save/. /data/
fi
exec "$@"
然后,该映像的Dockerfile将复制并配置该入口点:

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

实际上,您可以使用具有显式设备装入点的docker卷来实现这一点

如果目录/home/imf/WIP/thetool为空,请执行以下操作:

创建一个docker卷:



启动容器并装载创建的卷:

sudo docker run -it -v tool_vol:/home/thetool name/label

现在,容器中
/home/thetool
中的数据将在
/home/my/WIP/thetool
中可用,即使主机文件夹最初是空的。

Docker compose for yamenk伟大的答案是:

version: '2'                                                                                                                                                                                                        
services:
  your_service:
    volumes:
      - tool_vol:/home/thetool
    build: .
    command: your_command
volumes:
  tool_vol:
    driver: local
    driver_opts:
      type: none
      device: /home/myself/WIP/thetool
      o: bind

可能重复:很好地使用带有绑定装载的命名卷,+1。请注意,这仅在目录为空时有效,一旦其中有文件或容器最后一个实例的内容,docker将不会初始化它。谢谢。是的,它的行为类似于正常的卷。如果卷已经存在,则将装入该卷,否则将使用容器装入点的内容创建该卷。
version: '2'                                                                                                                                                                                                        
services:
  your_service:
    volumes:
      - tool_vol:/home/thetool
    build: .
    command: your_command
volumes:
  tool_vol:
    driver: local
    driver_opts:
      type: none
      device: /home/myself/WIP/thetool
      o: bind