dockerpy:Docker Python sdk container.put\u存档不工作

2024-10-04 01:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用/root/目录下的put_archive将example.py文件从本地系统复制到了容器中。我想在容器中运行文件。在容器中找不到该文件。这是我的代码:我的代码出了什么问题?我希望put_archive应该将example.py文件复制到/root目录下。在容器中找不到该文件

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"

  

Tags: 文件pyimportclientcloudexamplecontainersdk
2条回答

我在工作一天后发现了这个问题。容器应该运行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.containers.run(),您都在创建一个新的容器。如果运行docker ps -a(或调用client.containers.list(all=True)),您应该能够看到这一点。最后两个命令在未修改的基本映像上运行,没有复制应用程序代码

相关问题 更多 >