Docker挂载到文件夹覆盖内容

时间:2017-12-05 23:02:12

标签: docker volume mount

我有一个.net Core web Api,在名为Config的文件夹下有配置文件。 我创建了图像和容器,我正确地看到使用终端,容器包含文件夹和里面的配置文件。

我的问题是到目前为止,我无法找到一种方法来创建相同的容器,将Config文件夹挂载/绑定到物理路径,符合要求:

1)将Config文件夹挂载到特定主机位置

2)在容器创建时,Config文件夹应填充图像中的文件

3)在容器创建时,覆盖文件夹中已存在的任何现有文件与图像中的文件

4)能够从主机

自定义文件夹中的配置文件

我的创建命令:

    docker --tls -H="$containerUrl" `
        create `
        --hostname $hostname `
        --name $containerName `
        --mac-address=$containerMacAddress `
        --ip $containerIpAddress `
        --net "bridged-network" `
        --workdir '/app' `
        --mount type=bind,src=$configVolumePath,target=/app/Config `
        --publish "0.0.0.0::80" `
        -t `
        -i $imageName":"$script:buildversion    

使用 - mount ,类型为 bind ,如文档中所指定,如果文件夹中有任何文件,那么这些文件在容器和应用程序中是隐藏的将看到已部署的文件。 此解决方案的问题是我无法从主机更新config文件夹中的文件。

现在,删除 type = bind 我得到了相同的结果,这让人感到困惑。

我尝试使用卷 - volume $ configVolumePath":/ app / Config:rw" ,但这样做不会覆盖主机目录中的预先存在的文件是将在容器中使用的那个。

附加说明,我没有在Dockerfile中指定任何内容或与音量安装相关的组成,我没有尝试创建一个音量然后将其用作音源,但我并没有这样做。我认为这会有所作为。

容器服务器正在NAS上运行,这是版本:

 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   781516c
 Built:        Thu Aug  3 16:04:05 2017
 OS/Arch:      linux/amd64

显然,我错过了一些东西,我必须了解更多关于码头工具的信息,有人可以帮忙吗?

我的推荐信:

1)https://docs.docker.com/engine/admin/volumes/bind-mounts/

2)https://docs.docker.com/engine/admin/volumes/volumes/

1 个答案:

答案 0 :(得分:17)

首先,docker卷或绑定挂载的行为类似于linux挂载。

如果主机卷/挂载存在且包含文件,它将"覆盖"容器中的任何东西。如果不是,容器文件将镜像到主机卷/装载器上,容器文件夹和主机将同步。 在这两种情况下,编辑主机上的文件总是会在容器内重新进行。

在您的情况下,您可以执行以下操作:

docker volume create --driver local \
    --opt type=none \
    --opt device=$configVolumePath \
    --opt o=bind \
    config_vol

这将创建一个将在主机上的$ configVolumePath中保留的卷。

创建容器时使用该卷:

docker create --volume config_vol:/app/Config

您将获得的是启动时,主机文件夹将为空,图像中的文件将被复制"到主机文件夹。编辑$configVolumePath中的文件将在容器内部进行重新选择 在容器/app/Config内编辑的文件将反映在主机上的$configVolumePath中。