All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.mike10004.containment.dockerjava.DjStartableContainer Maven / Gradle / Ivy

package io.github.mike10004.containment.dockerjava;

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.exception.DockerException;
import io.github.mike10004.containment.ContainerInfo;
import io.github.mike10004.containment.ContainmentException;
import io.github.mike10004.containment.ContainerCopier;
import io.github.mike10004.containment.StartableContainer;
import io.github.mike10004.containment.StartedContainer;

import java.util.StringJoiner;
import java.util.concurrent.atomic.AtomicBoolean;

import static java.util.Objects.requireNonNull;

public class DjStartableContainer implements StartableContainer {

    private final ContainerInfo info;
    private final DockerClient client;
    private final DjContainerMonitor containerMonitor;
    private final AtomicBoolean started;

    public DjStartableContainer(ContainerInfo info, DockerClient client, DjContainerMonitor containerMonitor) {
        this.info = requireNonNull(info, "info");
        this.client = requireNonNull(client);
        this.containerMonitor = requireNonNull(containerMonitor);
        started = new AtomicBoolean(false);
    }

    @Override
    public ContainerCopier copier() {
        return new DjContainerCopier(client, info);
    }

    @Override
    public ContainerInfo info() {
        return info;
    }

    @Override
    public synchronized void close() throws ContainmentException {
        maybeRemove();
        containerMonitor.removed(info.id());
    }

    private void maybeRemove() throws ContainmentException {
        boolean hasBeenStarted = started.get();
        if (hasBeenStarted && info.isAutoRemoveEnabled()) {
            /*
             * Then the container will be removed when it stops, so we don't
             * have to do remove it explicitly.
             */
            return;
        }
        String containerId = info.id();
        try {
            client.removeContainerCmd(containerId).withForce(true).exec();
        } catch (DockerException e) {
            throw new ContainmentException(e);
        }
    }

    @Override
    public synchronized StartedContainer start() throws ContainmentException {
        ContainerInfo info = info();
        try {
            client.startContainerCmd(info.id()).exec();
            started.getAndSet(true);
            containerMonitor.started(info.id());
        } catch (DockerException e) {
            throw new ContainmentException(e);
        }
        return new DjStartedContainer(client, info, containerMonitor);
    }


    @Override
    public String toString() {
        return new StringJoiner(", ", DjStartableContainer.class.getSimpleName() + "[", "]")
                .add("info=" + info)
                .add("started=" + started)
                .toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy