# 도커 허브에서 이미지를 가져와서 이미지를 작업한다
# FROM (이미지 이름:버전)
# FROM node:14.15.4
FROM node
# 컨테이너 실행 전 작동할 명령
# RUN (명령)
# 타임존 설정 (설정을 하지 않으면 시간 저장시 다른 시간대로 저장됨)
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone
# 컨테이너 내 작업 경로
# WORKDIR (경로)
WORKDIR /app
# 작업 파일을 컨테이너로 복사
# COPY (파일명 또는 ${변수명}) (복사할 파일명)
# app dependencies, install 및 caching
COPY . .
# 컨테이너 실행 전 작동할 명령
# RUN (명령)
RUN yarn install
# 이미지 내부 환경 설정
# ENV (타겟) (내용)
# `/app/node_modules/.bin`을 $PATH 에 추가
# (bin폴더를 찾기 어려울 수 있으므로 환경변수에 추가해줌)
ENV PATH /app/node_modules/.bin:$PATH
RUN yarn build
# 컨테이너 시작 시 내릴 명령 (CMD와 ENTRYPOINT 차이 확인)
# ENTRYPOINT [(명령),(매개변수),(매개변수),(...)]
CMD ["yarn", "start"]
스프링부트 도커파일 예제
# 도커 허브에서 이미지를 가져와서 이미지를 작업한다
# FROM (이미지 이름:버전)
FROM openjdk:11.0.8-jre-slim
# 컨테이너 실행 전 작동할 명령
# RUN (명령)
# 타임존 설정 (설정을 하지 않으면 시간 저장시 다른 시간대로 저장됨)
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone
# 컨테이너 내 작업 경로
# WORKDIR (경로)
WORKDIR /app
# 작업 파일을 변수화 하기
# ARG (변수명)=(파일명)
ARG JAR_FILE=demo*.jar
# 작업 파일을 컨테이너로 복사
# COPY (파일명 또는 ${변수명}) (복사할 파일명)
COPY ${JAR_FILE} application.jar
# 컨테이너 시작 시 내릴 명령 (CMD와 ENTRYPOINT 차이 확인)
# ENTRYPOINT [(명령),(매개변수),(매개변수),(...)]
ENTRYPOINT ["java","-jar","application.jar"]
마리아 db 도커파일 예제
# 도커 허브에서 이미지를 가져와서 이미지를 작업한다
# FROM (이미지 이름:버전)
FROM mariadb
# 컨테이너 실행 전 작동할 명령
# RUN (명령)
# 타임존 설정 (설정을 하지 않으면 시간 저장시 다른 시간대로 저장됨)
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone
# 이미지 내부 환경 설정
# ENV (타겟) (내용)
ENV MYSQL_USER testuser
ENV MYSQL_PASSWORD password
ENV MYSQL_ROOT_PASSWORD password
그런데 최근 일부 기능이 사용되지 않으면서 외부 서비스에 비용이 매달 지출된다는 것을 발견하였다.
그 기능을 일시적으로 비활성화 하기로 하였다.
2. 기능 수정은 간단하군
오랜만에 건드리는 프로젝트라 걱정이 앞섰으나, 사실 그렇게 어려운 부분은 없었다.
해당 기능을 사용할 수 없도록 화면을 약간 수정하고 소스코드를 몇가지 주석처리를 했을 뿐이다.
1시간도 걸리지 않은 것 같다.
3. 즐거운 마음으로 배포하고 퇴근하자
오후 4시에 시작한 수정 작업은 5시쯤 완료 되었다.
테스트폰에 돌려보니 잘돌아간다.
인텔리제이가 targetSdkVersion 30에 노란불을 띄웠길래 버전업이 되었구나 하며 31버전으로 바꾸었다.
이제 구글 플레이 콘솔에 업로드만 하면 배포 준비는 끝... 이라고 생각하였으나
업로드하자 콘솔에서 배포불가능한 코드라는 식의 메시지가 뜬다.
해당 사진자료를 스크린샷하지 못하였지만 대략 아래와 비슷한 내용이었다.
아 안돼...
퇴근시간 안에 배포해야 한다. 그래야 칼퇴가 가능하다.
4. 와 야근!
빨리 빨리...
원인을 찾자. 내가 무얼했지?
아 그래, sdk 버전을 올렸지. 업데이트하는 김에 타겟을 높이면 좋잖아?
그게 문제였나.
좋다. 그럼 버전을 내려서 다시 업로드해야지.
그래들에서 sdk버전을 내린 뒤 apk 빌드를 시작한다... 엥?
The minCompileSdk (31) specified in a dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties) is greater than this module's compileSdkVersion (android-30).
위와 같은 에러가 발생했다.
디펜던시 문제라고 한다.
'androidx.appcompat:appcompat:1.4.1' 때문이란다.
내 프로젝트엔 'androidx.appcompat:appcompat:1.4.1'이 없는데?
점점 미궁으로 빠져든다.
다시 compileSdkVersion과 targetSdkVersion을 31버전으로 올려서 빌드해본다... 엥?
Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.
아 현기증이 올라온다. 시간은 벌써 9시.
칼퇴는 무슨... 집으로 가자.
5. 간과한 점은 무엇인가
다음 날 아침, 멘탈을 다시 부여잡고 냉정하게 상황 판단을 시작한다.
내가 간과한 것이 무엇인가? - 프로젝트를 오랜만에 수정하였다 - 작업 컴퓨터를 바꾸었다 - 안드로이드 스튜디오 버전이 바뀌었다 - 모바일 플랫폼은 수시로 업데이트되고 바뀐다
정리가 되기 시작한다.
프로젝트를 작년에 완료한 후 작업 컴퓨터를 바꾸었고, 해당 프로젝트는 Github에 저장되어 있으니, 로컬에는 받아놓지도 않았다.
젯브레인 툴박스로 안드로이드 스튜디오를 설치하니, Arctic Fox가 설치된다. 일부러 설치 안하던 버전이었는데 이제는 강제로 설치된다.
컴파일 및 타겟 sdk버전을 주의없이 수정하였다. (이건 억울하다. Arctic Fox 때문이다...)
6. 해결
'정답은 구글이 알고 있다'는 옛 선현들의 말씀에 따라 다시 해결책을 찾아 나선다.
인텔리제이 캐시를 비워보기도 하고 그래들 디펜던시 캐시도 삭제해보고 Arctic Fox 최신버전을 설치해보고 sdk버전도 30~32를 넘나들며 바꿔보았다.