Docker deploy_container sends literal None command when command is omitted

未關閉 適合新手
#2,226 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
2/5
預估耗時
1-3 小時
新手友好度
76/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
docker, python
領域
cloud

研究方向

從 libcloud/container/drivers/docker.py 中的 DockerContainerDriver.deploy_container() 開始,該處會在建構 create payload 之前執行 command = shlex.split(str(command))。執行 issue 中的重現指令碼,確認省略引數時 Cmd 為 ['None']。完成標準是:省略 command 或傳入 None 時,Cmd 不會出現在請求中;而像 'echo "hello world"' 這樣的明確字串仍會被拆分成引數。

由索引模型根據 Issue 內容生成。

描述

Summary

DockerContainerDriver.deploy_container() turns its default command=None into the literal command ['None'] in the container-create request. Omitting the argument therefore sends an explicit command override rather than leaving the image's default command alone.

The documented Docker example calls deploy_container('tomcat', image) without a command.

Detailed Information

Observed on unchanged trunk 8a0ef6260680625d54fce5093d2315e0926a7dc9, Libcloud 4.0.0.dev0, Python 3.12/Linux. This is a request-serialization reproduction using the actual driver method with API-version negotiation and response transport substituted. No Docker daemon/container was started.

import json
from types import SimpleNamespace
from unittest.mock import patch
from libcloud.container.drivers.docker import DockerContainerDriver
from libcloud.container.base import ContainerImage

with patch.object(DockerContainerDriver, '_get_api_version', return_value='1.24'):
    driver = DockerContainerDriver()
image = ContainerImage('i', 'test-image', 'test-image', 'latest', driver)

for kwargs in ({}, {'command': None}, {'command': ''},
               {'command': 'echo "hello world"'}):
    requests = []
    def request(action, **options):
        requests.append((action, options))
        body = {'Id': 'local-probe'} if action.endswith('/create') else {
            'Id': 'local-probe', 'Name': '/local-probe',
            'Image': 'test-image', 'Status': 'Created', 'Ports': []}
        return SimpleNamespace(object=body)
    driver.connection = SimpleNamespace(request=request, driver=driver)
    driver.deploy_container('local-probe', image, start=False, **kwargs)
    print(kwargs, json.loads(requests[0][1]['data'])['Cmd'])

Output:

{} ['None']
{'command': None} ['None']
{'command': ''} []
{'command': 'echo "hello world"'} ['echo', 'hello world']

The cause is command = shlex.split(str(command)) before building the payload. The optional absent value is converted to text before splitting. Expected: preserve the no-command-override case while retaining parsing of explicit command strings.

Docker's CMD documentation describes the image command as a default, overridden by supplied command arguments. This report establishes the incorrect outgoing Cmd, not a live-daemon startup error or full-suite result. No production code change yet.

AI assistance: ChatGPT helped investigate, reproduce, and draft this report.

主要語言
Python
星號
2.1k
分支
935
平均合併
5 天 3 小時
30 天內合併 PR
15

環境準備

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

apache/libcloud 的其他 Issue

查看 apache/libcloud 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。