Maven 플러그 인 docker-maven-plugin 사용

1,docker-maven-plugin 소개
우리 가 지속 적 으로 통합 하 는 과정 에서 프로젝트 공 사 는 보통 Maven 컴 파일 포장 을 사용 한 다음 에 미 러 를 생 성 한다.미 러 를 통 해 온라인 에 접속 하면 온라인 효율 을 크게 제공 할 수 있 고 빠 른 동적 확장 과 빠 른 스크롤 백 을 할 수 있어 서 정말 편리 하 다.docker-maven-plugin 플러그 인 은 Maven 프로젝트 에서 간단 한 설정 을 통 해 미 러 를 자동 으로 생 성하 고 창고 로 보 내 는 것 을 돕 기 위해 서 입 니 다.
2.환경,소프트웨어 준비
이번 프레젠테이션 환경 에서 저 는 이 컴퓨터 Mac OX 에서 작 동 합 니 다.다음은 설 치 된 소프트웨어 와 버 전 입 니 다.
  • Docker:version 17.03.1-ce
  • Maven:version 3.3.9
  • Java: version 1.8.0_91
  • docker-maven-plugin:1.0.0
  • 메모:자바 Maven 프로젝트 를 docker-maven 플러그 인 으로 미 러 를 치고 미 러 를 업로드 하 는 등 작업 을 테스트 하려 면 Docker,Maven,자바 를 설치 해 야 합 니 다.설치 과정 을 무시 합 니 다.
    3.데모 예시
    3.1 DOCKER 설정HOST
    docker-maven-plugin 플러그 인 은 로 컬 Docker 주 소 를 기본 으로 연결 합 니 다.localhost:2375 이 므 로 환경 변 수 를 설정 해 야 합 니 다.
    
    DOCKER_HOST=tcp://<host>:2375
    
    메모:DOCKER 가 설정 되 어 있 지 않 으 면HOST 환경 변수,명령 행 에 지정 한 DOCKER 를 표시 할 수 있 습 니 다.HOST 가 실행 합 니 다.이 컴퓨터 가 지정 한 DOCKER 와 같 습 니 다.HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build。
    3.2 예시 로 미 러 구축
    미 러 구축 은 두 가지 방식 을 사용 할 수 있 습 니 다.첫 번 째 는 구축 정 보 를 POM 에 지정 하 는 것 이 고 두 번 째 는 존재 하 는 Dockerfile 로 구축 하 는 것 입 니 다.
    첫 번 째 방식 은 FROM,ENTRYPOINT,CMD,MAINTAINER 및 ADD 정 보 를 POM 에 설정 하 는 것 을 지원 하 며 Dockerfile 설정 을 사용 하지 않 아 도 됩 니 다.단,VOLUME 나 다른 Dockerfile 의 명령 을 사용 할 때 두 번 째 방식 으로 Dockerfile 을 만 들 고 POM 에 dockerDirectory 를 설정 하여 경 로 를 지정 하면 됩 니 다.
    자바 Maven 프로젝트 mavendemo 를 예 로 들 어 보 여 드 리 겠 습 니 다.
    3.2.1 구축 정 보 를 POM 에 구축 하도록 지정
    
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>mavendemo</imageName>
                    <baseImage>java</baseImage>
                    <maintainer>docker_maven [email protected]</maintainer>
                    <workdir>/ROOT</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                    <!--       jar    docker          -->
                    <resources>
                        <resource>
                            <targetPath>/ROOT</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
    3.2.2 Dockerfile 로 구축
    pom.xml 설정
    
    <build>
        <plugins>
             <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>mavendemo</imageName>
                    <dockerDirectory>${basedir}/docker</dockerDirectory> <!--    Dockerfile   -->
                    <!--       jar    docker         ,      Docokerfile   -->
                    <resources>
                        <resource>
                            <targetPath>/ROOT</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>   
        </plugins>
    </build>
    ${basedir}/docker/dockerfile 설정
    
    FROM java
    MAINTAINER docker_maven [email protected]
    WORKDIR /ROOT
    CMD ["java", "-version"]
    ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]
    상기 두 가지 방식 으로 docker:build 효 과 를 실행 합 니 다.출력 과정 은 대체적으로 다음 과 같 습 니 다.
    
    [INFO] --- docker-maven-plugin:1.0.0:build (default-cli) @ mavenDemo ---
    [INFO] Building image mavendemo
    Step 1/5 : FROM java
     ---> d23bdf5b1b1b
    Step 2/5 : MAINTAINER docker_maven [email protected]
     ---> Using cache
     ---> 2faf180d4a50
    Step 3/5 : WORKDIR /ROOT
     ---> Using cache
     ---> 862210f7956a
    Step 4/5 : ENTRYPOINT java -jar mavenDemo.jar
     ---> Running in 96bbe83de6ec
     ---> c29009c88993
    Removing intermediate container 96bbe83de6ec
    Step 5/5 : CMD java -version
     ---> Running in f69b8d2a75b1
     ---> bc8d54014325
    Removing intermediate container f69b8d2a75b1
    Successfully built bc8d54014325
    
    실행 이 완료 되면 docker images 를 사용 하여 생 성 된 미 러 를 봅 니 다:
    
    REPOSITORY       TAG           IMAGE ID            CREATED             SIZE
    mavendemo        latest        333b429536b2        38 minutes ago      643 MB
    
    3.3 명령 을 집행 한다mvn clean package docker:buildbuild 작업 만 수행 합 니 다.mvn clean package docker:build -DpushImage 빌 드 완료 후 push 미 러 실행
    화면 음악 n clean package docker:build-DushImageTag build 실행 및 push 지정 tag 의 미 러
    메모:최소한 하나의 imageTag 를 지정 해 야 합 니 다.POM 에 설정 할 수도 있 고 명령 행 에 지정 할 수도 있 습 니 다.명령 행 지정 은 다음 과 같 습 니 다:mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2,POM 파일 에서 지정 한 설정 은 다음 과 같 습 니 다:
    
    <build>
      <plugins>
        ...
        <plugin>
          <configuration>
            ...
            <imageTags>
               <imageTag>imageTag_1</imageTag>
               <imageTag>imageTag_2</imageTag>
            </imageTags>
          </configuration>
        </plugin>
        ...
      </plugins>
    </build>
    
    3.4 Docker 명령 을 Maven 각 단계 로 귀속
    우 리 는 Docker 명령 을 Maven 각 단계 에 연결 할 수 있 습 니 다.우 리 는 Docker 를 build,tag,push 로 나 눈 다음 에 Maven 의 package,deploy 단 계 를 각각 연결 할 수 있 습 니 다.이때 우 리 는 mvn deploy 만 실행 하면 전체 build,tag,push 작업 을 완성 할 수 있 습 니 다.mvn build 를 실행 하면 build,tag 작업 만 완성 할 수 있 습 니 다.그 밖 에 우리 가 특정한 절 차 를 뛰 어 넘 거나 특정한 절차 만 수행 하려 고 할 때 POM 파일 을 수정 할 필요 가 없고 docker 의 특정한 절 차 를 뛰 어 넘 으 면 됩 니 다.예 를 들 어 우리 프로젝트 에 자동화 템 플 릿 이 설정 되 어 있 지만 이번 에는 로 컬 에서 자체 측정 만 하면 push 단 계 를 실행 하고 싶 지 않 습 니 다.그러면 이 때 지정 한 매개 변수-DskipDockerPush 를 실행 하면 push 작업 을 건 너 뛸 수 있 습 니 다.
    
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>mavendemo</imageName>
                    <baseImage>java</baseImage>
                    <maintainer>docker_maven [email protected]</maintainer>
                    <workdir>/ROOT</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/ROOT</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
                <executions>
                    <execution>
                        <id>build-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>tag-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>tag</goal>
                        </goals>
                        <configuration>
                            <image>mavendemo:latest</image>
                            <newName>docker.io/wanyang3/mavendemo:${project.version}</newName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>push-image</id>
                        <phase>deploy</phase>
                        <goals>
                            <goal>push</goal>
                        </goals>
                        <configuration>
                            <imageName>docker.io/wanyang3/mavendemo:${project.version}</imageName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    상기 예시 에서,우리 가 mvn 패 키 지 를 실행 할 때,build,tag 작업 을 실행 하고,mvn deploy 를 실행 할 때,build,tag,push 작업 을 실행 합 니 다.만약 우리 가 docker 의 어떤 과정 을 뛰 어 넘 으 려 면:
  • -DskipDockerBuild 빌 드 미 러 건 너 뛰 기
  • -DskipDockerTag 태그 건 너 뛰 기 미 러
  • -DskipDockerPush push 미 러 건 너 뛰 기
  • -DskipDocker 전체 단 계 를 건 너 뛰 기
  • 예 를 들 어 패 키 지 를 실행 하려 면 tag 과정 을 건 너 뛰 려 면 뮤 직 비디오 패키지-DskipDockerTag 가 필요 합 니 다.
    3.5 개인 Docker 창고 주소 사용
    실제 작업 환경 에서 저 희 는 push 미 러 를 개인 Docker 창고 에 넣 어야 합 니 다.d ocker-maven-plugin 플러그 인 을 사용 하면 저희 도 쉽게 실현 할 수 있 습 니 다.몇 가지 방식 으로 이 루어 집 니 다.
    1.POM 파일 imageName 작업 수정
    
    ...
    <configuration>
        <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName>
        ...
    </configuration>
    ...
    2.POM 파일 의 new Name 동작 수정
    
    ...
    <configuration>
        <imageName>mavendemo</imageName>
        ...
    </configuration>
    <execution>
        <id>tag-image</id>
        <phase>package</phase>
        <goals>
            <goal>tag</goal>
        </goals>
        <configuration>
            <image>mavendemo</image>
            <newName>registry.example.com/wanyang3/mavendemo:v1.0.0</newName>
        </configuration>
    </execution>
    ...
    
    3.6 안전 인증 설정
    Google push 미 러 가 Docker 창고 에 있 을 때 공유 든 개인 이 든 항상 안전 인증 이 필요 합 니 다.로그 인 이 완료 되 어야 작업 을 할 수 있 습 니 다.물론 명령 행 docker login-u username -p password docker_registry_host 로그 인,하지만 자동화 프로 세 스에 있어 서 는 그다지 편리 하지 않 습 니 다.docker-maven-plugin 플러그 인 을 사용 하면 안전 인증 을 쉽게 실현 할 수 있 습 니 다.
    먼저 Maven 의 프로필 setting.xml 에 관련 server 설정 을 추가 하고 Docker registry 사용자 인증 정 보 를 설정 합 니 다.
    
    <servers>
      <server>
        <id>my-docker-registry</id>
        <username>wanyang3</username>
        <password>12345678</password>
        <configuration>
          <email>[email protected]</email>
        </configuration>
      </server>
    </servers>
    
    그리고 pom.xml 에서 server id 를 사용 하면 됩 니 다.
    
    <plugin>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.0.0</version>
        <configuration>
          <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName>
          ...
          <serverId>my-docker-registry</serverId>
        </configuration>
      </plugin>
    </plugins>
    
    3.7 기타 매개 변수
    docker-maven-plugin 플러그 인 은 실 용적 인 설정 도 많이 제공 합 니 다.몇 개의 인 자 를 살짝 열거 하 세 요.
    매개 변수
    설명 하 다.
    기본 값<forceTags>true</forceTags>build 시 tag 를 강제로 덮어 쓰 고 imageTags 에 맞 춰 사용 합 니 다.
    false<noCache>true</noCache>build 시 지정 한 Cno-cache 는 캐 시 를 사용 하지 않 습 니 다.
    false<pullOnBuild>true</pullOnBuild>build 시,Cpull=true 를 지정 할 때마다 기본 미 러 를 다시 끌 어 옵 니 다.
    false<pushImage>true</pushImage>build 완료 후 push 미 러
    false<pushImageTag>true</pushImageTag>build 완료 후 push 지정 tag 의 미 러 를 imageTags 에 맞 춰 사용 합 니 다.
    false<retryPushCount>5</retryPushCount>push 미 러 실패,재 시도 횟수
    5<retryPushTimeout>10</retryPushTimeout>push 미 러 실패,재 시도 시간
    10s<rm>true</rm>build 시 지정 한 Crm=true 즉 build 완료 후 중간 용기 삭제
    false<useGitCommitId>true</useGitCommitId>build 시 최근 git commit id 7 위 를 tag 로 사용 합 니 다.예 를 들 어 image:b50b 604 는 new Name 을 설정 하지 않 는 것 이 전제 입 니 다.
    false
    4、FAQ
    1.build images 를 실행 할 때 오류 보고 1:
    [INFO] Building image mavendemo
    org.apache.http.impl.execchain.RetryExec execute
    I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
    [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project mavenDemo: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: No such file or directory -> [Help 1]
    이것 은 Docker 서비스 가 시작 되 지 않 아서 생 긴 것 입 니 다.Docker 를 시작 하면 됩 니 다.
    2.build images 를 실행 할 때 오류 보고 2:
    ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project mavenDemo: Exception caught: Request error: POST unix://localhost:80/build?t=mavenDemo: 500, body: {"message":"Error parsing reference: \"mavenDemo\" is not a valid repository/tag: repository name must be lowercase"}: HTTP 500 Internal Server Error -> [Help 1]
    이것 은 미 러 이름 이 정확 하지 않 기 때문에 Docker 미 러 이름 이[a-z0-9-.]와 일치 해 야 합 니 다.
    참고 자료
    docker-maven-plugin
    Maven 플러그 인 docker-maven-plugin 의 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 docker-maven-plugin 의 사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기