Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.github.dockerjava.api.command.CommitCmd;
import com.github.dockerjava.api.command.ConnectToNetworkCmd;
import com.github.dockerjava.api.command.ContainerDiffCmd;
import com.github.dockerjava.api.command.ExportContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
Expand Down Expand Up @@ -233,6 +234,15 @@ public interface DockerClient extends Closeable {

ContainerDiffCmd containerDiffCmd(@Nonnull String containerId);

/**
* Export the contents of a container's filesystem as a tar archive.
*
* @param containerId
* id of the container
* @return created command
*/
ExportContainerCmd exportContainerCmd(@Nonnull String containerId);

StopContainerCmd stopContainerCmd(@Nonnull String containerId);

KillContainerCmd killContainerCmd(@Nonnull String containerId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.github.dockerjava.api.command.CommitCmd;
import com.github.dockerjava.api.command.ConnectToNetworkCmd;
import com.github.dockerjava.api.command.ContainerDiffCmd;
import com.github.dockerjava.api.command.ExportContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
Expand Down Expand Up @@ -276,6 +277,11 @@ public ContainerDiffCmd containerDiffCmd(@Nonnull String containerId) {
return getDockerClient().containerDiffCmd(containerId);
}

@Override
public ExportContainerCmd exportContainerCmd(@Nonnull String containerId) {
return getDockerClient().exportContainerCmd(containerId);
}

@Override
public StopContainerCmd stopContainerCmd(@Nonnull String containerId) {
return getDockerClient().stopContainerCmd(containerId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,11 @@ public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
return getDockerCmdExecFactory().createContainerDiffCmdExec();
}

@Override
public ExportContainerCmd.Exec createExportContainerCmdExec() {
return getDockerCmdExecFactory().createExportContainerCmdExec();
}

@Override
public KillContainerCmd.Exec createKillContainerCmdExec() {
return getDockerCmdExecFactory().createKillContainerCmdExec();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ public interface DockerCmdExecFactory extends Closeable {

ContainerDiffCmd.Exec createContainerDiffCmdExec();

ExportContainerCmd.Exec createExportContainerCmdExec();

KillContainerCmd.Exec createKillContainerCmdExec();

UpdateContainerCmd.Exec createUpdateContainerCmdExec();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.github.dockerjava.api.command;

import java.io.InputStream;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

import com.github.dockerjava.api.exception.NotFoundException;

/**
* Export the contents of a container as a tar archive.
*/
public interface ExportContainerCmd extends SyncDockerCmd<InputStream> {

@CheckForNull
String getContainerId();

ExportContainerCmd withContainerId(@Nonnull String containerId);

/**
* Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks.
*
* @throws NotFoundException
* No such container
*/
@Override
InputStream exec() throws NotFoundException;

interface Exec extends DockerCmdSyncExec<ExportContainerCmd, InputStream> {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.github.dockerjava.api.command.CommitCmd;
import com.github.dockerjava.api.command.ConnectToNetworkCmd;
import com.github.dockerjava.api.command.ContainerDiffCmd;
import com.github.dockerjava.api.command.ExportContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
Expand Down Expand Up @@ -89,6 +90,7 @@
import com.github.dockerjava.core.exec.CommitCmdExec;
import com.github.dockerjava.core.exec.ConnectToNetworkCmdExec;
import com.github.dockerjava.core.exec.ContainerDiffCmdExec;
import com.github.dockerjava.core.exec.ExportContainerCmdExec;
import com.github.dockerjava.core.exec.CopyArchiveFromContainerCmdExec;
import com.github.dockerjava.core.exec.CopyArchiveToContainerCmdExec;
import com.github.dockerjava.core.exec.CopyFileFromContainerCmdExec;
Expand Down Expand Up @@ -368,6 +370,11 @@ public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public ExportContainerCmd.Exec createExportContainerCmdExec() {
return new ExportContainerCmdExec(getBaseResource(), getDockerClientConfig());
}

@Override
public KillContainerCmd.Exec createKillContainerCmdExec() {
return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.github.dockerjava.api.command.CommitCmd;
import com.github.dockerjava.api.command.ConnectToNetworkCmd;
import com.github.dockerjava.api.command.ContainerDiffCmd;
import com.github.dockerjava.api.command.ExportContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
Expand Down Expand Up @@ -93,6 +94,7 @@
import com.github.dockerjava.core.command.CommitCmdImpl;
import com.github.dockerjava.core.command.ConnectToNetworkCmdImpl;
import com.github.dockerjava.core.command.ContainerDiffCmdImpl;
import com.github.dockerjava.core.command.ExportContainerCmdImpl;
import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl;
import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl;
import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl;
Expand Down Expand Up @@ -470,6 +472,11 @@ public ContainerDiffCmd containerDiffCmd(String containerId) {
return new ContainerDiffCmdImpl(getDockerCmdExecFactory().createContainerDiffCmdExec(), containerId);
}

@Override
public ExportContainerCmd exportContainerCmd(String containerId) {
return new ExportContainerCmdImpl(getDockerCmdExecFactory().createExportContainerCmdExec(), containerId);
}

@Override
public StopContainerCmd stopContainerCmd(String containerId) {
return new StopContainerCmdImpl(getDockerCmdExecFactory().createStopContainerCmdExec(), containerId);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.github.dockerjava.core.command;

import java.io.InputStream;
import java.util.Objects;

import com.github.dockerjava.api.command.ExportContainerCmd;
import com.github.dockerjava.api.exception.NotFoundException;

/**
* Export the contents of a container as a tar archive.
*/
public class ExportContainerCmdImpl extends AbstrDockerCmd<ExportContainerCmd, InputStream> implements
ExportContainerCmd {

private String containerId;

public ExportContainerCmdImpl(ExportContainerCmd.Exec exec, String containerId) {
super(exec);
withContainerId(containerId);
}

@Override
public String getContainerId() {
return containerId;
}

@Override
public ExportContainerCmdImpl withContainerId(String containerId) {
this.containerId = Objects.requireNonNull(containerId, "containerId was not specified");
return this;
}

/**
* @throws NotFoundException
* No such container
*/
@Override
public InputStream exec() throws NotFoundException {
return super.exec();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.github.dockerjava.core.exec;

import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.dockerjava.api.command.ExportContainerCmd;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.MediaType;
import com.github.dockerjava.core.WebTarget;

public class ExportContainerCmdExec extends AbstrSyncDockerCmdExec<ExportContainerCmd, InputStream>
implements ExportContainerCmd.Exec {

private static final Logger LOGGER = LoggerFactory.getLogger(ExportContainerCmdExec.class);

public ExportContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}

@Override
protected InputStream execute(ExportContainerCmd command) {
WebTarget webResource = getBaseResource().path("/containers/{id}/export").resolveTemplate("id",
command.getContainerId());

LOGGER.trace("GET: {}", webResource);

return webResource.request().accept(MediaType.APPLICATION_X_TAR).get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.github.dockerjava.cmd;

import com.github.dockerjava.api.command.CreateContainerResponse;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;

import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.emptyString;

public class ExportContainerCmdIT extends CmdIT {

private static final Logger LOG = LoggerFactory.getLogger(ExportContainerCmdIT.class);

@Test
public void exportContainerHasCreatedFile() throws Exception {
CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE)
.withCmd("touch", "/myExportedFile")
.exec();

LOG.info("Created container: {}", container.toString());
assertThat(container.getId(), not(is(emptyString())));

dockerRule.getClient().startContainerCmd(container.getId()).exec();

int exitCode = dockerRule.getClient().waitContainerCmd(container.getId()).start()
.awaitStatusCode();
assertThat(exitCode, is(0));

try (InputStream response = dockerRule.getClient().exportContainerCmd(container.getId()).exec()) {
boolean foundFile = false;
try (TarArchiveInputStream tarStream = new TarArchiveInputStream(response)) {
TarArchiveEntry entry;
while ((entry = tarStream.getNextTarEntry()) != null) {
if (entry.getName().contains("myExportedFile")) {
foundFile = true;
break;
}
}
}
assertThat("Exported archive should contain the created file", foundFile, is(true));
}
}

}
Loading