Docker 安装到覆盖内容的文件夹

问题描述 投票:0回答:1

我有一个 .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 或 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/

docker mount
1个回答
81
投票

首先,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
中。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.