2016-05-10 18 views
3

ドッカーPython API(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'),))

...私はドッキングウィンドウ・コンコードがやっていると思う何をしています。

誰かが私をここで助けることができますか?ドッカーリモートAPI用

答えて

3

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

A Pythonライブラリ。 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): 

しかし、私はstart functionlinksが見つかりました:

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)

私はDOにCoreOSを使用しています:

  1. 実行]ドッキングウィンドウコンテナを、ホストから/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

はい、ドッカー-PYのためのネットワークのドキュメント真剣に欠けている - メインtainersは同意します(グローバルエイリアスの例ではhttps://github.com/docker/docker-py/issues/982)。

上記のValeriyの答えは、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']) 

バレリーの例はその後になります。

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

この特定のコードはテストされていませんが、これは新しいコンテナを既存のコンテナに接続する方法です既存のものは "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')) 
関連する問題