Spotify는 더 이상 이 프로젝트의 최신 버전을 내부적으로 사용하지 않습니다. 우리가 사용하는 docker-client 버전은 helios의 pom.xml에 있는 버전입니다. 현재로서는 새로운 기능을 개발 또는 수용하지 않으며 중요하지 않은 버그도 수정하지 않습니다. 하지만 이 저장소를 자유롭게 포크해 보세요.
이것은 Java로 작성된 Docker 클라이언트입니다. 이는 Spotify의 많은 중요한 제작 시스템에서 사용됩니다.
docker-client는 Docker의 최신 6개 마이너 릴리스에 대해 구축 및 테스트되었습니다. 지금은 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을 사용하는 모든 플랫폼에서 빌드 가능해야 합니다.
Mac용 Docker 및 DefaultDockerClient.fromEnv()
사용하는 경우 DOCKER_HOST
환경 변수에 사용할 값이 명확하지 않을 수 있습니다. 사용해야 하는 값은 적어도 버전 1.11.1-beta11부터 DOCKER_HOST=unix:///var/run/docker.sock
입니다.
docker-client 버전 4.0.8부터 DefaultDockerClient.fromEnv()
기본적으로 OS X에서 unix:///var/run/docker.sock
사용합니다.
기본 Swarm 지원이 포함된 최신 버전의 docker(>= 1.12)를 실행 중인 경우 docker swarm init
실행하여 docker swarm을 초기화해야 합니다.
Docker 데몬이 실행 중이고 docker ps
수행할 수 있는지 확인하세요.
mvn test
사용하여 자체적으로 테스트를 실행할 수 있습니다. 테스트는 많은 수의 컨테이너를 시작하고 중지하므로 docker ps -a
로 표시되는 컨테이너 목록은 여러 테스트를 실행한 후 꽤 길어지기 시작합니다. 가끔 docker rm $(docker ps -aq)
실행하는 것이 도움이 될 수 있습니다.
마스터 브랜치에 커밋하면 지속적 통합 에이전트가 Sonatype에 업로드하여 jar을 빌드하고 릴리스하도록 트리거됩니다. 필요한 자격 증명을 갖춘 프로젝트 관리자인 경우 아래를 실행하여 로컬로 빌드하고 릴리스할 수도 있습니다.
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와의 충돌을 피하려면 위에서 음영 처리된 버전을 명시적으로 지정해야 합니다.
이 프로젝트는 공개 행동 강령을 준수합니다. 참여함으로써 귀하는 이 코드를 준수해야 합니다.