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 發生衝突,您需要明確指定上面的陰影版本。
該項目遵守開放行為準則。透過參與,您應該遵守此準則。