def test_rename(): name = random_name() new_name = random_name() assert name != new_name container = docker.container.run("hello-world", name=name, detach=True) docker.container.rename(container, new_name) container.reload() assert container.name == new_name docker.container.remove(container)
def test_filters(): random_label_value = random_name() containers_with_labels = [] for _ in range(3): containers_with_labels.append( docker.run( "busybox", ["sleep", "infinity"], remove=True, detach=True, labels=dict(dodo=random_label_value), )) containers_with_wrong_labels = [] for _ in range(3): containers_with_wrong_labels.append( docker.run( "busybox", ["sleep", "infinity"], remove=True, detach=True, labels=dict(dodo="something"), )) expected_containers_with_labels = docker.container.list(filters=dict( label=f"dodo={random_label_value}")) assert set(expected_containers_with_labels) == set(containers_with_labels) for container in containers_with_labels + containers_with_wrong_labels: container.kill()
def test_network_create_with_labels(): my_name = random_name() labels = {"hello": "world", "meme": "meme-label"} with docker.network.create(my_name, labels=labels) as my_network: assert my_network.name == my_name for key, value in labels.items(): assert my_network.labels[key] == value
def copy( self, source: Union[ValidPath, VolumePath], destination: Union[ValidPath, VolumePath], ): """Copy files/folders between a volume and the local filesystem. # Arguments source: If `source` is a directory/file inside a Docker volume, a tuple `(my_volume, path_in_volume)` must be provided. The volume can be a `python_on_whales.Volume` or a volume name as `str`. The path can be a `pathlib.Path` or a `str`. If `source` is a local directory, a `pathlib.Path` or `str` should be provided. End the source path with `/.` if you want to copy the directory content in another directory. destination: Same as `source`. """ with tempfile.TemporaryDirectory() as temp_dir: temp_dir = Path(temp_dir) content = "FROM scratch\nCOPY Dockerfile /\nCMD /Dockerfile" (temp_dir / "Dockerfile").write_text(content) buildx = python_on_whales.components.buildx.BuildxCLI( self.client_config) image_name = random_name() dummy_image = buildx.build(temp_dir, tags=image_name, progress=False, load=True) container = python_on_whales.components.container.ContainerCLI( self.client_config) volume_in_container = Path("/volume") if isinstance(source, tuple): volume_name = str(source[0]) dummy_container = container.create(dummy_image, volumes=[(volume_name, volume_in_container)]) container.copy( (dummy_container, os.path.join(volume_in_container, source[1])), destination, ) elif isinstance(destination, tuple): volume_name = str(destination[0]) dummy_container = container.create(dummy_image, volumes=[(volume_name, volume_in_container)]) container.copy( source, (dummy_container, os.path.join(volume_in_container, destination[1])), ) else: raise ValueError("source or destination should be a tuple.") dummy_container.remove() python_on_whales.components.image.ImageCLI( self.client_config).remove(image_name)
def test_run_volumes(): volume_name = random_name() docker.run( "busybox", ["touch", "/some/path/dodo"], volumes=[(volume_name, "/some/path")], remove=True, ) docker.volume.remove(volume_name)
def test_copy_from_and_to_directory(tmp_path): my_image = docker.pull("busybox:1") (tmp_path / "dodo.txt").write_text("Hello world!") new_image_name = random_name() my_image.copy_to(tmp_path, "/some_path", new_tag=new_image_name) new_image_name = docker.image.inspect(new_image_name) new_image_name.copy_from("/some_path", tmp_path / "some_path") assert "Hello world!" == (tmp_path / "some_path" / "dodo.txt").read_text()
def test_copy_from_and_to(tmp_path): my_image = docker.pull("busybox:1") (tmp_path / "dodo.txt").write_text("Hello world!") new_image_name = random_name() my_image.copy_to(tmp_path / "dodo.txt", "/dada.txt", new_tag=new_image_name) new_image_name = docker.image.inspect(new_image_name) new_image_name.copy_from("/dada.txt", tmp_path / "dudu.txt") assert (tmp_path / "dodo.txt").read_text() == (tmp_path / "dudu.txt").read_text()
def test_context_manager_with_create(): container_name = random_name() with pytest.raises(ArithmeticError): with docker.container.create("busybox:1", ["sleep", "infinity"], name=container_name) as c: assert isinstance(c, python_on_whales.Container) raise ArithmeticError assert container_name not in [ x.name for x in docker.container.list(all=True) ]
def test_context_manager(): container_name = random_name() with pytest.raises(ArithmeticError): with docker.run("busybox:1", ["sleep", "infinity"], detach=True, name=container_name): raise ArithmeticError assert container_name not in [ x.name for x in docker.container.list(all=True) ]
def test_context_manager(): with pytest.raises(DockerException): with docker.network.create(random_name()) as my_net: docker.run( "busybox", ["ping", "idonotexistatall.com"], networks=[my_net], remove=True, ) # an exception will be raised because the container will fail # but the network will be removed anyway. assert my_net not in docker.network.list()
def test_name(): name = random_name() container = docker.container.run("hello-world", name=name, detach=True) assert container.name == name docker.container.remove(container)
def test_network_create_remove(): my_name = random_name() with docker.network.create(my_name) as my_network: assert my_network.name == my_name
def test_network_create_remove(): my_name = random_name() my_network = docker.network.create(my_name) assert my_network.name == my_name docker.network.remove(my_name)
def test_prune_prunes_network(): network_name = random_name() my_net = docker.network.create(network_name) assert my_net in docker.network.list() docker.system.prune() assert my_net not in docker.network.list()