# Flutter Docker 반복 지연 대응 정리 작성일: 2026-07-03 대상: Windows Android Studio emulator + WSL/Docker Flutter CLI 조합에서 반복 실행 시 느려지는 항목 ## 1. 목적 Android integration test와 Docker Flutter 실행에서 반복적으로 오래 걸리는 문제를 따로 모아, 다음 실행부터 시간을 줄일 수 있는 대응안을 정리한다. ## 2. 반복 지연 항목 | 항목 | 실제 증상 | 원인 | 우선 대응 | | --- | --- | --- | --- | | NDK 재설치 | 매 integration test에서 NDK license 확인 및 설치 반복 | Docker container가 매번 새로 뜨고 Android SDK 쓰기 경로가 유지되지 않음 | `.docker-cache/flutter/android-sdk/ndk` 유지 | | CMake 재설치 | 매 integration test에서 CMake license 확인 및 설치 반복 | 위와 동일 | `.docker-cache/flutter/android-sdk/cmake` 유지 | | Android SDK license 재확인 | license accept 로그 반복 | licenses 디렉터리 비지속 | `.docker-cache/flutter/android-sdk/licenses` 유지 | | Gradle dependency 준비 시간 | `assembleDebug`가 매번 길어짐 | `/root/.gradle` 비지속 | `.docker-cache/flutter/gradle` 유지 | | Flutter pub dependency 준비 | `flutter pub get` 반복 시간이 누적 | `/root/.pub-cache` 비지속 | `.docker-cache/flutter/pub` 유지 | | ADB unauthorized | emulator 연결은 되지만 `unauthorized` | Docker ADB key와 Windows 승인 key 불일치 | `.android-adb/`에 Windows ADB key 재사용 | | Integration test 직전 API 실패 | real API login test만 실패 | Baron/Ory runtime 중단 | `./scripts/api-smoke.sh` 선행 | ## 3. 이미 적용한 대응 현재 저장소에는 아래 대응이 이미 반영되어 있다. - `scripts/flutter-docker.sh` - `.android-adb/`를 Docker `/root/.android`로 마운트 - `.docker-cache/flutter/gradle`를 Docker `/root/.gradle`로 마운트 - `.docker-cache/flutter/pub`를 Docker `/root/.pub-cache`로 마운트 - `.docker-cache/flutter/android-sdk/licenses`를 Docker `/opt/android-sdk-linux/licenses`로 마운트 - `.docker-cache/flutter/android-sdk/ndk`를 Docker `/opt/android-sdk-linux/ndk`로 마운트 - `.docker-cache/flutter/android-sdk/cmake`를 Docker `/opt/android-sdk-linux/cmake`로 마운트 - `.gitignore` - `.android-adb/` - `.docker-cache/` ## 4. 권장 실행 순서 반복 지연과 실패를 줄이려면 아래 순서를 기본값으로 사용한다. 1. Windows emulator를 먼저 실행한다. 2. Windows `adb.exe devices`에서 `device` 상태를 확인한다. 3. `5555` portproxy까지 준비한다. 4. host 기준 `./scripts/api-smoke.sh`를 먼저 실행한다. 5. 아래 명령으로 Docker local ADB 상태를 확인한다. ```bash TDC114_ADB_CONNECT_ADDRESS=172.21.128.1:5555 ./scripts/flutter-docker.sh devices ``` 6. 이후 integration test를 실행한다. ```bash TDC114_SMOKE_ENV_FILE=scripts/.env.android-emulator.local \ TDC114_ADB_CONNECT_ADDRESS=172.21.128.1:5555 \ ./scripts/integration_tests.sh ``` ## 5. 지연을 더 줄이는 추가 후보 아래는 아직 이번 턴에서 적용하지 않았지만, 추가로 검토할 가치가 있다. ### 5.1 Flutter Docker image 고정 `ghcr.io/cirruslabs/flutter:stable` 대신 검증된 tag를 고정하면 image 내부 Android SDK 구성이 갑자기 바뀌는 위험을 줄일 수 있다. 예: ```bash FLUTTER_DOCKER_IMAGE=ghcr.io/cirruslabs/flutter:3.32.5 ``` 효과: - 예측 가능한 SDK/Gradle 조합 유지 - cache 호환성 추적이 쉬워짐 주의: - 프로젝트 Flutter 버전과 맞지 않는 tag는 피한다. ### 5.2 Android 빌드 전용 warm-up 명령 긴 integration test 전에 아래를 먼저 실행해 build cache를 예열할 수 있다. ```bash TDC114_ADB_CONNECT_ADDRESS=172.21.128.1:5555 ./scripts/flutter-docker.sh build apk --debug ``` 효과: - 첫 integration test에서 체감 지연 감소 주의: - 근본 해결은 cache 유지이며, warm-up은 보조 수단이다. ### 5.3 runtime health gate 자동화 integration test 시작 전에 `./scripts/check-baron-api-env.sh`와 `./scripts/api-smoke.sh`를 자동으로 선행하도록 `integration_tests.sh`를 확장할 수 있다. 효과: - 앱 테스트 실패와 backend runtime 실패를 더 빨리 구분 주의: - 테스트 시작 시간은 조금 늘어나지만, 재시도 횟수는 줄일 가능성이 크다. ## 6. 언제 cache를 비워야 하는가 아래 상황이 아니면 cache 삭제를 먼저 하지 않는다. - Flutter Docker image를 크게 변경했다. - Gradle/NDK/CMake 관련 이상한 충돌이 반복된다. - cache 안 파일이 root 권한 꼬임으로 재사용되지 않는다. 부분 삭제 우선순위: 1. `.docker-cache/flutter/android-sdk/cmake` 2. `.docker-cache/flutter/android-sdk/ndk` 3. `.docker-cache/flutter/gradle` 4. `.docker-cache/flutter/pub` 전체 삭제는 마지막 수단으로 둔다. ## 7. 현재 결론 매번 너무 오래 걸리는 문제는 어느 정도 해결 또는 완화가 가능하다. - 해결 가능한 부분: - ADB unauthorized - NDK/CMake 반복 설치 - Gradle/pub cache 반복 준비 - backend runtime 미감지 상태에서 앱 테스트를 먼저 돌리는 문제 - 완화만 가능한 부분: - Android 첫 빌드 자체의 절대 시간 - Docker image pull 또는 변경 직후 초기 warm-up 비용 - emulator 자체 부팅 시간 다음 실행부터는 `5555 + Docker local ADB + cache 유지 + api-smoke 선행` 조합을 기본값으로 사용한다.