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:

  • Passing arguments from CMD in docker
  • How to start docker-machine on OSX?
  • Python console within Pycharm in a Ubuntu Virtualbox fails to connect
  • Permission denied in a Docker container even if user has the rights
  • Error: image orgsync/java8 not found
  • Tensorflow: unable to navigate to tensorflow folder using docker [Windows 10 Home edition]
  • 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?

  • Docker container drive does not match available hard drive space on host
  • Unable to set up Docker UCP cluster
  • one docker daemon can support how many docker containers? [closed]
  • How to add Dockerfile to a docker registry page?
  • how know container name with marathon rest API
  • How can I make a local docker container?
  • 3 Solutions collect form web for “How to bind volumes in docker-py?”

    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'))
    

    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

    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)
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.