5个版本

0.1.4 2023年3月2日
0.1.3 2023年3月1日
0.1.2 2023年2月28日
0.1.0 2023年2月21日
0.0.0 2023年2月8日

#11#pull


用于 angreal

GPL-3.0-only

61KB
1.5K SLoC

Rust 1.5K SLoC // 0.0% comments Python 258 SLoC // 0.1% comments

docker-pyo3

Python绑定rust的docker_api crate。

基本用法

pip install docker_pyo3


from docker_pyo3 import Docker

# Connecto the daemon
docker = Docker()

# pull an image
docker.images().pull(image='busybox')

# build an image
docker.images().build(path="path/to/dockerfile",dockerfile='Dockerfile',tag='test-image')

# run a container
c = docker.containers().create(image='busybox',name='weee')

完整的API示例可以在py_test文件夹中查看。

Python已经有docker了,为什么还需要这个?

这是一个好问题。简而言之,因为这个库是为了构建到rust项目中,以便将其作为插件接口暴露Python。如果您只需要在Python中使用Docker,请使用pip install docker;如果您只需要在Rust中使用Docker,请使用docker_api crate。如果您需要通过pyo3将Python接口添加到Rust库/二进制文件的容器中,这将帮助您大部分工作。

酷,我该怎么做呢?

请参考下面的示例。但基本上,只需按照pyo3中的说明注册模块并设置包状态。这将在以下命名空间和它们内部创建以下类:

  • root_module._integrations.docker, Docker
  • root_module._integrations.image, Image Images
  • root_module._integrations.container, Container Containers
  • root_module._integrations.network, Network Networks
  • root_module._integrations.volume, Volume Volumes
#[pymodule]
fn root_module(_py: Python, m: &PyModule) -> PyResult<()> {
    py_logger::register();
    m.add_function(wrap_pyfunction!(main, m)?)?;
    task::register(_py, m)?;
    utils::register(_py, m)?;

    
    m.add_wrapped(wrap_pymodule!(_integrations))?;

    let sys = PyModule::import(_py, "sys")?;
    let sys_modules: &PyDict = sys.getattr("modules")?.downcast()?;
    sys_modules.set_item("root_module._integrations", m.getattr("_integrations")?)?;
    sys_modules.set_item("root_module._integrations.docker", m.getattr("_integrations")?.getattr("docker")?)?;

    sys_modules.set_item("root_module._integrations.docker.image", m.getattr("_integrations")?.getattr("docker")?.getattr("image")?)?;
    sys_modules.set_item("root_module._integrations.docker.container", m.getattr("_integrations")?.getattr("docker")?.getattr("container")?)?;
    sys_modules.set_item("root_module._integrations.docker.network", m.getattr("_integrations")?.getattr("docker")?.getattr("network")?)?;
    sys_modules.set_item("root_module._integrations.docker.volume", m.getattr("_integrations")?.getattr("docker")?.getattr("volume")?)?;
    Ok(())
}

#[pymodule]
fn _integrations(_py: Python, m:&PyModule) -> PyResult<()>{
    m.add_wrapped(wrap_pymodule!(docker))?;
    Ok(())
}

#[pymodule]
fn docker(_py: Python, m:&PyModule) -> PyResult<()>{
    m.add_class::<docker_pyo3::Pyo3Docker>()?;
    m.add_wrapped(wrap_pymodule!(docker_pyo3::image::image))?;
    m.add_wrapped(wrap_pymodule!(docker_pyo3::container::container))?;
    m.add_wrapped(wrap_pymodule!(docker_pyo3::network::network))?;
    m.add_wrapped(wrap_pymodule!(docker_pyo3::volume::volume))?;
    Ok(())
}

依赖项

~13–24MB
~396K SLoC