代码之家  ›  专栏  ›  技术社区  ›  Norcino

Docker装载到文件夹覆盖内容

  •  36
  • Norcino  · 技术社区  · 7 年前

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

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

    1) 将配置文件夹装载到特定主机位置

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

    3) 创建容器时,将文件夹中已存在的任何现有文件替换为图像中的文件

    4) 能够从主机自定义文件夹中的配置文件

    我的create命令:

        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    
    

    使用 --安装 带类型 绑定 ,如文档中所述,如果文件夹中有任何文件,则这些文件将隐藏在容器中,应用程序将看到部署的文件。 这个解决方案的问题是我无法从主机更新config文件夹中的文件。

    现在,删除 类型=绑定 我得到了同样的结果,这令人困惑。

    我试着用音量 --卷$configVolumePath“:/app/Config:rw” ,但这样做不会覆盖主机目录中的预存在文件,这些文件将在容器中使用。

    另外,我没有在Dockerfile或compose中指定任何与卷装载相关的内容,我也没有尝试创建一个卷,然后将其用作源,但我认为这不会有什么不同。

    容器服务器正在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
    

    很明显,我错过了一些东西,我必须了解更多关于docker的信息,有人能帮我吗?

    我的推荐信:

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

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

    1 回复  |  直到 7 年前
        1
  •  60
  •   mles    4 年前

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

    如果主机卷/装载存在并包含文件,它将“覆盖”容器中的任何内容。如果没有,容器文件将镜像到主机卷/装载上,容器文件夹和主机将同步。 在这两种情况下,在主机上编辑文件始终会反映在容器内。

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

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

    创建容器时,请使用该卷:

    docker create --volume config_vol:/app/Config
    

    您将得到的是在启动时,主机文件夹将为空,并且图像中的文件将“复制”到主机文件夹中。在中编辑文件 $configVolumePath 将在容器内反射,同样 在容器内编辑的文件 /app/Config 将反映在 $configVolumePath 在主机上。