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:

  • How to extend existing docker container?
  • Multiple services to run on a container or multiple containers Docker?
  • Tutum HAProxy Docker Virtual Host forward to entry point path
  • Converting standard LAMP installation to Docker?
  • How do I register logging driver for docker?
  • Can I restart a docker container listed in the docker ps -a output?
  • 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 Compose env_file in Multicontainer Elastic Beanstalk
  • HostPath with minikube - Kubernetes
  • How do you manage development tasks when setting up your development environment using docker containers?
  • Allowing Docker container to access Postgres running on localhost
  • Is there a way to rename network interfaces in Docker swarm?
  • Connect docker container to local workbench MySQL DB
  • 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.