콘텐츠로 건너뛰기

Airflow Dag 작성 Best practice

Airflow Dag 작성 Best practice

단순하게 스프링 어플리케이션을 도커파일로 작성하면 아래와 같다. FROM openjdk11ARG JARFILEbuildlibs.jarCOPY JARFILE app.jarEXPOSE 8080tcpENTRYPOINT java,jar,app.jar Spring Boot의 빌드 결과는 바로 실행 가능한 일 jar 파일로 나오기 때문에, 단순히 jar 파일을 옮겨주고 실행 시켜주는 것만으로 Dockerfile 작성이 끝난다. 하지만, 여기에서 Dockerfile을 하나씩 최적화 시켜보자. Docker 이미지 생성 시 필요없는 파일은 최대한 제거해줍니다.

특히 Dockerfile의 경우 은근히 사이즈가 크기 때문에 Dockerfile은 ignore 해주도록 합니다.


Build in Docker
Build in Docker

Build in Docker

지금까지는 Dockerfile 외부에서 빌드를 하고, 빌드된 결과만을 복사해서 작성하는 방법을 살펴봤습니다. 그렇게되면 빌드조차 각 사용자의 영향을 받는다. 빌드 명령어를 각자 다르게 입력 아니면 빌드 환경이 달라진다 따라서, spring boot 빌드 자체도 Dockerfile에 녹이는게 좋습니다. 이로써 받는 장점은 다음과 같다. 빌드까지 따로 할 필요가 없으니, 일 Dockerfile로 진정한 이미지가 완성됩니다.

CI 도구와 통합할 필요가 없습니다.. (연동할 필요가 없습니다.. ) 빌드 명령어 또한 형상관리가 가능합니다. Dockerfile을 작성하면 다음과 같다.

AWS Service Catalog
AWS Service Catalog

AWS Service Catalog

비유하자면 일종의 AWS Resource Vending Machines. 다시, 위의 Dev Environment를 예시로 들면 create manage perapproved portfolios products 담당. portfolio admin은 CloudFormation template으로 AWS Resource provisioning을 요청할 수 있어요.

이걸 Catalog에서는 product라고 부른다.

Portfolio에는 Product가 포함될 수 있어요. users can browse the portfolios, and launch products on their accounts. Dev Environment 라는 Portfolio를 정의합니다.

로컬 state를 사용할 때의 흔한 문제점

어플리케이션의 다른 부분에 위치한 여러 컴포넌트가 동일한 stateex 유저정보를 공유하고 사용해야 할 때, 특히 그러한 state 요소가 다른 부분에 위치할 때 문제가 발생합니다. 아래 이미지를 보시면 Home컴포넌트가 User data와 Layout data를 가지고 있습니다. 하지만 Profile컴포넌트도 User data가 필요한 상황입니다. 하지만 두 컴포넌트는 평행하게 놓여있어 state를 물려줄 수 있는 구조가 아닙니다.

이것을 리덕스를 사용하여 개선하면 아래와 같은 flow가 됩니다.

AWS Config

AWS Resource를 관리하기 위한 용도의 서비스. provides a detailed view of how AWS resources are configured in your AWS account. how resources are related to one another, how they were configured in the past changes over time can apply rules for how those resources are configured. Resource Administration 어떤 리소스가 create, modified, deleted 되었는지를 api polling 없이도 모니터링할 수 있어요.

Gradle Cache

gradle build를 CI 도구를 활용하는 것이 아닌, Docker image build 내부에서 하기 때문에 단점이 하나 생기는데, 바로 gradle cache를 활용하지 못한다는 것입니다. Docker image build가 어떠한 방식으로 이뤄지는지 알면 gradle 캐시를 적용하기가 왜 어려운지 알 수 있어요. 위에서 계속 언급했듯이 Docker image build는 일 컨테이너가 띄어져서 수행되는 것이 아닌, 여러번의 임시컨테이너를 거쳐서 레이어를 쌓는 형식으로 빌드가 이뤄진다.

따라서, 일반적으론 gradle cache 저장소를 호스트와 마운트해서 저장할 방법이 없습니다.. 이러한 이슈를 해결하기 위해 조금은 2가지 방법이 존재합니다.

자주 묻는 질문

Build in

지금까지는 Dockerfile 외부에서 빌드를 하고, 빌드된 결과만을 복사해서 작성하는 방법을 살펴봤습니다. 자세한 내용은 본문을 참고 해주시기 바랍니다.

AWS Service

비유하자면 일종의 AWS Resource Vending Machines. 궁금한 사항은 본문을 참고하시기 바랍니다.

로컬 state를 사용할 때의 흔한

어플리케이션의 다른 부분에 위치한 여러 컴포넌트가 동일한 stateex 유저정보를 공유하고 사용해야 할 때, 특히 그러한 state 요소가 다른 부분에 위치할 때 문제가 발생합니다. 자세한 내용은 본문을 참고 해주시기 바랍니다.