2016-05-10 9 views
3

Ich möchte die Docker-Python-API (pip install docker-py) verwenden, um einen Container zu erstellen und verknüpfen Sie es mit einem vorhandenen Container, den ich mit Docker-Compose erstellt habe.Link-Container mit dem Docker Python API

die Befehlszeilen dieser Verwendung ist einfach:

docker run --link EXISTING_CONTAINER:LINK_NAME mycontainer:mytag

Aber mit dem Docker API Ich bin stecken. Ich denke, dass ich die docker.Client().create_container() Methode verwenden muss, die einen - undokumentierten - Parameter links= nimmt. (Ich glaube stark, dass die Dokumentation ziemlich unvollständig ist ...).

Ich habe versucht, den Docker-Compose-Code zu lesen, und dies scheint den Parameter links= zu verwenden, aber ich konnte nicht herausfinden, wie.

Mein erster Versuch hat nicht funktioniert:

client_obj.create_container(..., links=(('EXISTING_CONTAINER', 'LINK_NAME'),))

... das ist, was ich denke, die Docker-compose Code tut.

Kann mir hier jemand helfen?

Antwort

3

https://github.com/docker/docker-py

Ein Python-Bibliothek für den Docker Remote API. Es macht alles, was der Andock-Befehl tut, aber innerhalb von Python - Container ausführen, verwalten, Bilder pullern/push usw.

create_container:

Creates a container that can then be .start() ed. 
Parameters are similar to those for the docker run 
command except it doesn't support the attach options (-a). 

Die source code of create_container

def create_container(self, image, command=None, hostname=None, user=None, 
        detach=False, stdin_open=False, tty=False, 
        mem_limit=None, ports=None, environment=None, 
        dns=None, volumes=None, volumes_from=None, 
        network_disabled=False, name=None, entrypoint=None, 
        cpu_shares=None, working_dir=None, domainname=None, 
        memswap_limit=None, cpuset=None, host_config=None, 
        mac_address=None, labels=None, volume_driver=None, 
        stop_signal=None, networking_config=None): 

Aber ich fand links bei start function:

def start(self, container, binds=None, port_bindings=None, lxc_conf=None, 
      publish_all_ports=None, links=None, privileged=None, 
      dns=None, dns_search=None, volumes_from=None, network_mode=None, 
      restart_policy=None, cap_add=None, cap_drop=None, devices=None, 
      extra_hosts=None, read_only=None, pid_mode=None, ipc_mode=None, 
      security_opt=None, ulimits=None): 

Also ich denke, Sie sollten:

from docker import Client 
>>> cli = Client(base_url='tcp://127.0.0.1:2375') 
>>> container = cli.create_container(
...  image='busybox:latest', 
...  command='/bin/sleep 30') 
>>> response = cli.start(container=container.get('Id'),links=[('EXISTING_CONTAINER', 'LINK_NAME')]) 

Das Arbeitsbeispiel (DO)

I CoreOS auf DO bin mit:

  1. Laufbehälter Docker und montieren innerhalb des /var/run/docker.sock von Host
  2. Tools
  3. laufendem Betrieb installiert werden Testcontainer EXISTING_CONTAINER
  4. führen Sie Python Beispiel

Der Satz von Befehlen:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:12.04 bash 
apt-get update;apt-get install python-pip -y;pip install docker-py 
docker run -d --name EXISTING_CONTAINER busybox sh -c "while true; do sleep 1;done" 

Python Beispiel

from docker import Client 
cli = Client(base_url='unix://var/run/docker.sock', version='auto') 
container = cli.create_container(
image='busybox:latest', 
command='/bin/sleep 30') 
response = cli.start(container=container.get('Id'),links=(('EXISTING_CONTAINER', 'LINK_NAME')) 

Das Ergebnis auf dem Host:

wp-coreos-512mb-ams2-01 ~ # docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
2f58e661579d  busybox    "sh -c 'while true; d" 23 seconds ago  Up 22 seconds       EXISTING_CONTAINER 
6f08dd3f5017  busybox:latest  "/bin/sleep 30"   9 minutes ago  Up 5 seconds       condescending_brown 
+1

Leider habe ich genau das versucht, und es funktioniert nicht. Hast du das versucht und es hat für dich funktioniert? Dann hätte ich vielleicht einen weiteren Fehler gemacht. – flypenguin

+0

Ich habe das Arbeitsbeispiel hinzugefügt –

+0

versuchte es, arbeitete, vielen Dank! – flypenguin

1

Ja, Dokumentation der Vernetzung für Docker-py Es fehlt ernsthaft - die Hauptsache trainer stimmen zu (https://github.com/docker/docker-py/issues/982 für ein globales Alias-Beispiel).

Beachten Sie, dass die obige Antwort von Valeriy einen Legacy-Link erzeugt, der (in meinem Fall) zu Problemen führen kann, wenn Sie ein nicht standardmäßiges Netzwerk verwenden, wie das von docker-compose.

In jedem Fall ist das Hinzufügen von Parametern zu Client.startdepreciated. https://github.com/docker/docker-py/blob/master/tests/integration/network_test.py#L190-213

@requires_api_version('1.22') 
def test_create_with_links(self): 
    net_name, net_id = self.create_network() 

    container = self.create_and_start(
     host_config=self.client.create_host_config(network_mode=net_name), 
     networking_config=self.client.create_networking_config({ 
      net_name: self.client.create_endpoint_config(
       links=[('docker-py-test-upstream', 'bar')], 
      ), 
     }), 
    ) 

    container_data = self.client.inspect_container(container) 
    self.assertEqual(
     container_data['NetworkSettings']['Networks'][net_name]['Links'], 
     ['docker-py-test-upstream:bar']) 

    self.create_and_start(
     name='docker-py-test-upstream', 
     host_config=self.client.create_host_config(network_mode=net_name), 
    ) 

    self.execute(container, ['nslookup', 'bar']) 

Valeriy Beispiel wie folgt würde dann aussehen:

Python Beispiel

from docker import Client 
cli = Client(base_url='unix://var/run/docker.sock', version='auto') 

# Note: 'bridge' is the default network 
net_config = cli.create_networking_config(
     {'bridge': self.docker_client.create_endpoint_config(
      links=[('EXISTING_CONTAINER', 'LINK_NAME')] 
     )} 
    ) 

container = cli.create_container(
    image='busybox:latest', 
    command='/bin/sleep 30', 
    network_configuration=net_config 
) 
response = cli.start(container=container.get('Id')) 

Ich habe

Die neue Art und Weise, dies zu tun in der unitttest finden Ich habe diesen spezifischen Code nicht getestet, aber auf diese Weise konnte ich einen neuen Container mit einem vorhandenen Container verbinden ner, während der bestehende durch Erstellen in einem Netzwerk "project_default" erstellt wurde.

Sie können auch überprüfen, this link für weitere Informationen und Hintergrund.

0

Unten ist die aktuelle Arbeitsweise zu tun.

links=[('postgres-modeldb', 'modeldb'),('postgres-userdb', 'userdb'),('redis-workerdb', 'workerdb')] 

host_config = client.create_host_config(
    links=links 
) 

networking_config = client.create_networking_config({ 
    'my-net': client.create_endpoint_config(
     links=links 
    ) 
}) 

container = client.create_container(
    image='josepainumkal/vwadaptor:jose_toolUI', 
    name=container_name, 
    host_config=host_config, 
    networking_config = networking_config 
) 

response = client.start(container=container.get('Id')) 
Verwandte Themen