簡體   English   中英

docker-py:Docker Python sdk container.put_archive 不工作

[英]docker-py : Docker Python sdk container.put_archive not working

我已經使用 /root/ 目錄下的 put_archive 將 example.py 文件從本地系統復制到容器。 我想在容器中運行文件。 在容器中找不到該文件。 這是我的代碼:我的代碼有什么問題? 我希望 put_archive 應該在 /root 目錄下復制一個文件 example.py。 在容器中找不到該文件。

import docker
import os
import tarfile
import time
import json
from io import BytesIO

client = docker.from_env()
image = client.images.pull("malark79/ibm-cloud-python-sdk")

container = client.containers.run("malark79/ibm-cloud-python-sdk", "pwd", detach=True)
print("Docker logs: " + str(container.logs()))

print(container.id)
print(container.name)
print(container.image)

f = open("example.py", "w") //open local file
with tarfile.open("example.py.tar.gz", "w:gz") as tar:
        tar.add(f.name, arcname=os.path.basename(f.name))
t = open("example.py.tar.gz", "rb")

works = container.put_archive("/root/", data=t)

t.close()
if not works:
        print("Can't create file in container")

container = client.containers.run("malark79/ibm-cloud-python-sdk", "ls -al /root", detach=True)
print("Docker logs: " + str(container.logs())) ### does not display file example.py

container = client.containers.run("malark79/ibm-cloud-python-sdk", "/usr/bin/python3 /root/example.py", detach=True)
print("Docker logs: " + str(container.logs()))  ### [Errno 2] No such file or directory\n"

  

我在工作 1 天后發現了這個問題。 容器應該正在運行,put_archive() 命令才能工作。

我的容器沒有運行,所以它不起作用。

這是工作代碼:

import tarfile
import time
import json
from io import BytesIO

client = docker.from_env()

image = client.images.pull("malark79/ibm-cloud-python-sdk")
for container in client.containers.list():
  print(container.id)
  print(container.name)
  print(container.image)

container = client.containers.get(container.id)

def copy_to(src, dst):
    name, dst = dst.split(':')
    container = client.containers.get(name)

    os.chdir(os.path.dirname(src))
    srcname = os.path.basename(src)
    print("src " + srcname)
    with tarfile.open("vpc-example.tar", 'w') as tar:
        try:
                tar.add(srcname)
        finally:
                tar.close()

    with open('vpc-example.tar', 'rb') as fd:
            ok = container.put_archive(path="/", data=fd)
            if not ok:
                raise Exception('Put file failed')
            else:
                print("no exception")

copy_to("./vpc-example.py", container.name+":/vpc-example.py")

cmd="/usr/bin/python3 /vpc-example.py"

code, str = container.exec_run(cmd)
print(code)
print(str)

如果您嘗試將代碼復制到 Docker 空間並運行它,則 Docker 圖像是更好的技術匹配。 這個 Python 代碼幾乎完全對應於 Dockerfile:

FROM malark79/ibm-cloud-python-sdk
WORKDIR /root
COPY example.py .
CMD /usr/bin/python3 /root/example.py

通常我會運行docker build並在我的最終代碼中引用構建的圖像,而無需嘗試手動復制腳本。如果您需要在每次有client.images.build()方法時重建圖像可以做它。

在您的示例代碼中,每次調用client.containers.run()時,您都在創建一個新容器。 如果您運行docker ps -a (或調用client.containers.list(all=True) ),您應該能夠看到這一點。 最后兩個命令在未修改的基礎映像上運行,沒有復制應用程序代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM