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:

  • Artifactory: using NetScaler as a reverse proxy for Docker
  • Docker daemon no start
  • docker-machine in docker on server
  • Docker - how to set up Apache + PHP in docker-compose.yml
  • Python script to add data to postgres docker container runs multiple times
  • Setting volumes in docker-compose.yml file for windows 10 home
  • 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?

  • Use multiple images in Dockerfile
  • Docker Postgres - PDO exception get
  • Can't connect to Express server inside Docker container created with docker-compose
  • Error pushing image via docker registry v2 api
  • CircleCI './docker-compose.yml' service 'version' doesn't have any configuration options
  • How to change resolv.conf for existing docker containers
  • 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.