Jasper van den Bosch
Jasper van den Bosch

Reputation: 3218

How to bind volumes in docker-py?

I think this used to work up to a few months ago. The regular commandline docker:

>> docker run --name 'mycontainer' -d -v '/new' ubuntu /bin/bash -c 'touch /new/hello.txt'
>> docker run --volumes-from mycontainer ubuntu /bin/bash -c 'ls new'
>> hello.txt

works as expected but I cannot get this to work in docker-py:

from docker import Client #docker-py
import time

docker = Client(base_url='unix://var/run/docker.sock')
response1 = docker.create_container('ubuntu', detach=True, volumes=['/new'],
    command="/bin/bash -c 'touch /new/hello.txt'", name='mycontainer2')
docker.start(response1['Id'])
time.sleep(1)
response = docker.create_container('ubuntu', 
    command="/bin/bash -c 'ls new'", 
    volumes_from='mycontainer2')
docker.start(response['Id'])
time.sleep(1)
print(docker.logs(response['Id']))

..always tells me that new doesn't exist. How is volumes-from supposed to be done with docker-py?

Upvotes: 8

Views: 12351

Answers (3)

josepainumkal
josepainumkal

Reputation: 1733

Below is the current working way to do volume bindings:

volumes= ['/host_location']
volume_bindings = {
                    '/host_location': {
                        'bind': '/container_location',
                        'mode': 'rw',
                    },
}

host_config = client.create_host_config(
                    binds=volume_bindings
)

container = client.create_container(
                    image='josepainumkal/vwadaptor:jose_toolUI',
                    name=container_name,
                    volumes=volumes,
                    host_config=host_config,
) 
response = client.start(container=container.get('Id'))

Upvotes: 11

techarch
techarch

Reputation: 1141

The original answer has been deprecated in the api and no longer works. Here is how you would do it by using the create host config commands

import docker

client = docker.from_env()

container = client.create_container(
    image='ubuntu',
    stdin_open=True,
    tty=True,
    command='/bin/sh',
    volumes=['/mnt/vol1', '/mnt/vol2'],

    host_config=client.create_host_config(binds={
        '/tmp': {
            'bind': '/mnt/vol2',
            'mode': 'rw',
        },
        '/etc': {
            'bind': '/mnt/vol1',
            'mode': 'ro',
        }
    })
)
client.start(container)

Upvotes: 6

Jasper van den Bosch
Jasper van den Bosch

Reputation: 3218

Starting from docker api version 1.10 volumes-from is an argument to start() instead of create()

Available from docker-py release 0.3.2

Pull request which introduced the change: https://github.com/dotcloud/docker-py/pull/200

Upvotes: 2

Related Questions