1

我正在努力实现一种机制来升级容器的基本映像。为此,我需要:

  1. 从当前容器中获取卷列表;
  2. 使用旧容器的配置(卷、网络等)创建一个新容器

创建新容器

我试着这样做:

docker_api.create_container(
        image=creation_data.get('image'),
        hostname=creation_data.get('hostname'),
        volumes=creation_data.get('volumes'),
        host_config=docker_api.create_host_config(
            binds=creation_data.get('volume_bindings'),
            port_bindings={80: 80},
            restart_policy={"MaximumRetryCount": 0, "Name": "always"}
        ))

创建数据

从旧容器中creation_data收集的位置如下:

 {
    'image': 'docker.akema.fr:5000/coaxis/coaxisopt_daemon:latest',
    'hostname': "test-01",
    'volumes': [
        "/home/mast/.ssh",
        "/etc/mast"
    ],
    'volumes_bindings': {
        "841d6a1709b365763c85fb4b7400c87f264d468eb1691a660fe81761da6e374f": {
            'bind': "/home/mast/.ssh",
            'mode': 'rw'
        },
        "002730cbb4dd9b37ad808915a60081508885d533fe003b529b8d0ab4fa46e92e": {
            'bind': "/etc/mast",
            'mode': 'rw'
        }
    },
    'networking_config': {
        'EndpointsConfig': {'opt_network_508be7': {'IPAMConfig': {'IPv4Address': '10.0.0.1'}}}
    }
}

问题

检查新容器时,该Mounts部分似乎没有正确的卷,Source字段是不同的路径

如何根据旧容器信息将卷挂载到新容器?

4

2 回答 2

3

我不知道您对第一个容器的启动方式有多少控制,但如果您这样做:

docker run --name container1 --volume vol1:/my/vol1/dir --volume vol2:/my/vol2/dir image1

要运行 container1,您只需执行此操作即可为 container2 重用 container1 卷:

docker run --name container2 --volume vol1:/my/vol1/dir --volume vol2:/my/vol2/dir image2

然后删除不会删除卷的 container1(即使它们尚未被其他容器重用)。

vol1 和 vol2 数据将存储在您的主机下/var/lib/docker/volumes/vol1/_data//var/lib/docker/volumes/vol2/_data/主机上。

因此,答案是:不要为此需要使用匿名卷,而是使用命名卷。如果你有一个需要重用的带有匿名卷的旧容器,我想你这次可以手动将它们复制到新容器的命名卷中。

于 2017-02-28T20:58:04.063 回答
0
于 2017-03-01T14:32:00.440 回答