나는 자바 다스 서비스에 대한의 손상있어 큰 타당성 시스템을 관리 할 수 있습니다. 우리는이 모든 주), 모든 구성 요소 / 애플 리케이션을 받는다는를 사용하여 구축되는 자바 libs와 일련의 핵심이있다. 각 응용 프로그램하지만 핵심 SDK 단지의 외부 의존성의 고유 한 집합이 있습니다. 나는 가장 좋은 방법은 건물 내부에 고정 표시기를 배포 모두 무엇인지 알아낼 수 없습니다. 이상적으로는 다단계 빌드 방식을 사용하여, 고정 표시기의 전체 수명주기를 원한다. 그러나, 나는 의존성의 큰 숫자와 더불어이를 최적화하는 방법을 볼 수 없습니다.
나는이 방법을 할 수있는 것 같습니다.
우리가 전에, Maven을 이용대로 빌드하고 의존성이 모든 앱과 캐시하면 인출 및 액세스 할 수 있도록 CI 서버 (젠킨스)에 공통 캐시. 그럼 그냥 복사본이 제품 항아리와 그것의 종속 (또는 지방 항아리) 컨테이너에, 그리고 실행하도록 설정하는 각 응용 프로그램에 대한 dockerfile 있습니다. 이 방법의 단점은 빌드 자체가 개발자와 CI 서버간에 다를 수있는 일이라는 것이다. 잠재적 바로 인터넷 매번에서 deps를 당겨 방지하기 위해 넥서스 같은 지역 받는다는 캐시를 사용할 수 있습니까? 하지만 여전히 문제가 해결되지 않는 dev에 빌드는 반드시 CI 빌드 환경과 일치하지 않습니다.
각 프로젝트에 대한 다단계 dockerfile를 사용합니다. 나는 이것을 시도했다, 그것은 작업을 수행하고 나는 그것을 너무 자주 가져 오지 않습니다 그래서 캐시 받는다는 종속성 층을 얻을 수 있었다. 불행하게도 중간 빌드 층은 응용 프로그램 당 1-2기가바이트 명중했다, 나는 데몬에서 '매달려'중간체를 제거 할 수 없습니다 또는 모든 캐싱 멀리 불고있다. 또한 뭔가 리딩에서 변경하는 경우 각 응용 프로그램을 다운로드 할 필요가 항아리에서 중복 엄청난 양의가 있다는 뜻. (그들은 모든 사용의 JUnit과 log4j에 다른 많은 유사성을 즉)
내가 보는 아니에요이 최적를 해결하는 방법이 있나요? 나는 기본적으로 두에 초점을 찾은 모든 블로그 (정말 나를 위해 아무것도 해결되지 않는 용기에 자신을 받는다는 실행에 대한 몇 가지 그 초점) 이상에 접근한다. 아마 어떤 다른 좋은 솔루션이없는 경우 옵션 1로가는 종료해야합니다.
I에 유래와 블로그에 주위를 확인했지만, 내가 찾을 수있는 모든 당신이 정말로 단지 하나의 응용 프로그램이 아니라 그 종속성 다운로드를 반복하지 않도록 중요하게 그들의 제품군을 구축한다고 가정 할 것으로 보인다.
나는 그것이 확인을 사용하는 것입니다 생각 .m2 / 저장소 파일 시스템 캐시만큼 당신이 설정 한 --update-snapshots
메이븐 빌드 옵션을 선택합니다. 당신이 빌드 환경 당 한 번만 각각의 .jar를 캐시하지 응용 프로그램에 한 번 있기 때문에, 더 나은 확장 할 수 있습니다. 또한 하나의 의존성의 변화는 고정 표시기 레이어 캐싱을 사용하는 경우 경우 것 전체 캐시를 무효화하지 않습니다.
불행하게도 잘 다단계 순간에 빌드와 결합 할 수 없습니다,하지만 당신은 그것을 요청하는 유일한 사람이있다 할 수 있습니다. 이 문제는 추가 요청 --volume
고정 표시기 빌드 명령에 대한 옵션을 선택합니다. 이 사람은 Dockerfile이 같은 지침을 수 있도록 요청 : RUN --mount=m2repo=/var/mvn/repo mvn install
.
두 기능은 당신이 당신의 다단계 빌드하는 동안 파일 시스템 캐시 받는다는 로컬을 사용할 수있다.
순간을 위해 나는 당신이 빌드 환경을 다른로 인해 많은 문제에 직면하지 않는 한 해결책으로 당신의 옵션 1을 유지 권합니다.