Docker python客户端未从自定义contex生成图像

2024-09-19 23:45:23 发布

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

简而言之:问题是,我希望docker客户端从用户定义的上下文运行docker build命令

长: 这是我的目录结构

main_directory
└── package
       ├──directory_x
       └──directory_y
          ├──docker
          |  └──Dockerfile 
          +-─dockerclient.py
          :

docker文件有一个步骤,我需要将整个main_directory复制到temp文件夹中

COPY . /path/temp/main_directory/

main_directory起,以下命令起作用

docker build -t foo:bar -f package/directory_y/docker/Dockerfile .

但是我在使用python docker客户机时不能这样做,因为它要求我提供Dockerfile的path,然后它从给定的路径运行docker build命令。我的dockerclient.py有以下代码

import docker
from ast import literal_eval

class DockerBuildException(BaseException): pass

client = docker.from_env()
dirPath = os.path.dirname(os.path.realpath(__file__))
# dirPath = path/to/main_directory/jagex_airflow/test

try:
    responce = client.images.build(path=dirPath + "/docker", tag="foo:bar")
    print(responce)
    for i in responce:
        if b'errorDetail' in i:
            d = literal_eval(i.decode('ascii'))
            raise DockerBuildException(d['errorDetail']['message'])
except DockerBuildException as e:
     print("Error: " + e.args[0])
     raise

这种方法的问题是COPY .会将所有文件/目录从~/main_directory/jagex_airflow/test/docker复制到容器中。而我希望它复制main_directory中的所有内容

我还尝试分别传递Dockerfile路径和context路径

with open(dirPath + "/docker/Dockerfile") as file_:
    dockerfile = file_.read()
f = BytesIO(dockerfile.encode('utf-8'))

client.images.build(path="path/to/main_directory/", fileobj=f, tag="foo:bar")

但这也不管用

我想知道client.images.build是否有任何可选参数来指定从何处运行docker build命令,以及一个单独的参数来说明Dockerfile的路径? 有人问过类似的问题here,但没有正确答案。从用户的评论中,有人建议将Dockerfile保存在根目录中,但我不想这样做。我的意思是,如果可以使用裸骨docker build命令,那么为什么不使用python客户机呢?或者docker python SDK真的有这个限制吗?如果是这样的话,有人能推荐我docker的其他python客户端吗(如果有的话)


Tags: pathdocker命令dockerfilebuild路径clientfoo