Spotify 内部不再使用该项目的最新版本。我们使用的 docker-client 版本是 helios 在其 pom.xml 中的版本。目前,我们不会开发或接受新功能,甚至不会修复非关键错误。不过,请随意分叉此存储库。
这是一个用 Java 编写的 Docker 客户端。它被用于 Spotify 的许多关键制作系统。
docker-client 是针对 Docker 的六个最新次要版本构建和测试的。现在是 17.03.1 CE-17.12.1 ce(特别是这里的那些)。我们上传在 Docker 17.12.1~ce 上测试的工件。有关 Docker 版本和 API 版本之间的映射,请参阅 Docker 文档。
下载最新的 JAR 或通过 Maven 获取。
< dependency >
< groupId >com.spotify groupId >
< artifactId >docker-client artifactId >
< version >LATEST-VERSION version >
dependency >
// Create a client based on DOCKER_HOST and DOCKER_CERT_PATH env vars
final DockerClient docker = DefaultDockerClient . fromEnv (). build ();
// Pull an image
docker . pull ( "busybox" );
// Bind container ports to host ports
final String [] ports = { "80" , "22" };
final Map < String , List < PortBinding >> portBindings = new HashMap <>();
for ( String port : ports ) {
List < PortBinding > hostPorts = new ArrayList <>();
hostPorts . add ( PortBinding . of ( "0.0.0.0" , port ));
portBindings . put ( port , hostPorts );
}
// Bind container port 443 to an automatically allocated available host port.
List < PortBinding > randomPort = new ArrayList <>();
randomPort . add ( PortBinding . randomPort ( "0.0.0.0" ));
portBindings . put ( "443" , randomPort );
final HostConfig hostConfig = HostConfig . builder (). portBindings ( portBindings ). build ();
// Create container with exposed ports
final ContainerConfig containerConfig = ContainerConfig . builder ()
. hostConfig ( hostConfig )
. image ( "busybox" ). exposedPorts ( ports )
. cmd ( "sh" , "-c" , "while :; do sleep 1; done" )
. build ();
final ContainerCreation creation = docker . createContainer ( containerConfig );
final String id = creation . id ();
// Inspect container
final ContainerInfo info = docker . inspectContainer ( id );
// Start container
docker . startContainer ( id );
// Exec command inside running container with attached STDOUT and STDERR
final String [] command = { "sh" , "-c" , "ls" };
final ExecCreation execCreation = docker . execCreate (
id , command , DockerClient . ExecCreateParam . attachStdout (),
DockerClient . ExecCreateParam . attachStderr ());
final LogStream output = docker . execStart ( execCreation . id ());
final String execOutput = output . readFully ();
// Kill container
docker . killContainer ( id );
// Remove container
docker . removeContainer ( id );
// Close the docker client
docker . close ();
如果您正在寻找如何使用 docker-client,请参阅用户手册。如果您正在寻找如何构建和开发它,请继续阅读。
docker-client 应该可以在任何具有 Docker 1.6+、JDK8+ 和最新版本的 Maven 3 的平台上构建。
如果您使用 Docker for Mac 和DefaultDockerClient.fromEnv()
,则可能不清楚DOCKER_HOST
环境变量使用什么值。您应该使用的值是DOCKER_HOST=unix:///var/run/docker.sock
,至少从版本 1.11.1-beta11 开始。
从 docker-client 4.0.8 版本开始, DefaultDockerClient.fromEnv()
默认在 OS X 上使用unix:///var/run/docker.sock
。
如果您正在运行最新版本的 docker (>= 1.12),其中包含本机 swarm 支持,请确保运行docker swarm init
来初始化 docker swarm。
确保 Docker 守护进程正在运行并且您可以执行docker ps
。
您可以使用mvn test
自行运行测试。请注意,测试会启动和停止大量容器,因此在多次测试运行后,您使用docker ps -a
看到的容器列表将开始变得相当长。您可能会发现偶尔发出docker rm $(docker ps -aq)
很有帮助。
提交到 master 分支将触发我们的持续集成代理来构建 jar 并通过上传到 Sonatype 进行发布。如果您是具有必要凭据的项目维护者,您还可以通过运行以下命令在本地构建和发布。
mvn clean [-DskipTests -Darguments = -DskipTests] -Dgpg.keyname= < key ID used for signing artifacts > release:prepare release:perform
请注意,在版本 2.7.6 及更早版本中,默认工件是着色版本。升级到版本 2.7.7 时,如果您依赖 docker-client jar 中的着色依赖项,则需要包含着色分类器。
标准:
< dependency >
< groupId >com.spotify groupId >
< artifactId >docker-client artifactId >
< version >3.5.12 version >
dependency >
阴影:
< dependency >
< groupId >com.spotify groupId >
< artifactId >docker-client artifactId >
< classifier >shaded classifier >
< version >3.5.12 version >
dependency >
如果您在项目中使用 Jersey 1.x,这一点尤其重要。为了避免与 docker-client 和 Jersey 2.x 发生冲突,您需要显式指定上面的阴影版本。
该项目遵守开放行为准则。通过参与,您应该遵守此准则。