2016-05-10 2 views
3

Я хочу использовать API-интерфейс docker python (pip install docker-py), чтобы создать контейнер и связать его с существующим контейнером, который я создал с помощью docker-compose.ссылки контейнеры с docker python API

Использование командной строки это легко:

docker run --link EXISTING_CONTAINER:LINK_NAME mycontainer:mytag

Но с помощью докер API я застрял. Я думаю, что мне нужно использовать метод docker.Client().create_container(), который принимает недокументированный параметр links=. (Я сильно думаю, что документация в значительной степени неполна ...).

Я пробовал читать код для составления докеры, и это похоже на параметр links=, но я не мог понять, как это сделать.

Моя первая попытка не работает:

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

... что то, что я думаю, докер-Compose код делает.

Может кто-нибудь помочь мне здесь?

ответ

3

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

библиотека Python, для удаленного API Докер. Он делает все, что делает команда docker , но изнутри контейнеров Python управляет ими, тянуть/нажимать изображения и т. Д.

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

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

Но я нашел linksstart 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): 

Так что я думаю, вы должны:

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

Рабочий пример (DO)

Я использую CoreOS на DO:

  1. запустить Docker контейнер и смонтировать внутри /var/run/docker.sock от хозяина
  2. установить инструменты
  3. пробег тестовый контейнер EXISTING_CONTAINER
  4. запустить пример python

Набор команд:

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

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

Результат на хосте:

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

К сожалению, я пробовал именно это, и он не работает. Вы пробовали это, и это сработало для вас? Тогда я мог бы сделать еще одну ошибку. – flypenguin

+0

Я добавил рабочий пример –

+0

попробовал, работал, спасибо большое! – flypenguin

1

Да, документация сети для Докер-ру серьезно не хватает - основной tainers согласны (https://github.com/docker/docker-py/issues/982 для глобального псевдонима).

Обратите внимание, что ответ Валерия выше приведет к созданию устаревшей ссылки, которая может (в моем случае) привести к возникновению проблем, если вы используете нестандартную сеть, такую ​​как созданные, созданные docker-compose.

В любом случае добавление параметров в Client.start составляет depreciated.

Новый способ сделать это можно найти в unitttest: 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 был бы выглядеть следующим образом:

Python Пример

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

У меня есть не проверял этот конкретный код, но так я смог подключить новый контейнер к существующей ner, тогда как существующий был создан путем компоновки в сеть «project_default»

Возможно, вы также захотите проверить this link для получения дополнительной информации и информации.

0

Ниже приведен текущий рабочий способ для этого.

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')) 
Смежные вопросы