이번에 Flutter라는 프레임워크를 공부해서 내 머릿속에 있는 아이디어를 앱으로 꺼내보려고 공부를 시작하려고 한다.
일단 목표는 내가 아이폰을 사용하고 있기 때문에 IOS 앱을 만들어서 직접 써보고, Android까지 확장해보려고 한다.
1. 직면한 오류
사실 해결하고 나서는 오류라고 적기도 웃긴 상황이었습니다.
일단 발생한 내용은 아래와 같다.
flutter doctor를 쳐보면, 위처럼 Flutter 가동에 필요한 요소들이 정상적으로 설정/설치되어 있는지를 확인해 볼 수 있다.
Android Studio, Xcode, Visual Studio Code 모두 정상적으로 설치하고, 설정도 완료했다.
근데, 가장 중요한 Flutter 쪽에서 오류가 발생했다.
2. 발생 원인
보면 "/Users/ooo/Developments/flutter/bin/flutter"에서 Flutter가 실행되고 있는데, 네가 설정한 경로는 "/Users/ooo/developments/flutter"라는 것을 말해주고 있습니다.
처음에 뭐가 다른데... 이러고 한참을 쳐다보고 있었는데, 자세히 보면 Developments의 대소문자가 다르게 설정되어 있었습니다. 제가 만든 Developments 파일과 제가 환경 변수에서 설정한 developments가 달라서 인식을 제대로 하지 못하고 있었습니다.
오류 내용만 Stack over flow에 검색해 보면 Dart가 이미 설치되어 있는지 확인하고, 지우라고 되어 있는데 저는 Dart를 설치한 적이 없었기 때문에 계속 뭐지... 만 하고 있었는데 허무한 원인이었습니다.
Docker Hub는 무료로 계정 1개당 1개의 Private 저장소를 사용할 수 있도록 제공해 줍니다.
저는 이전에 Private 저장소를 쓴 적이 없기 때문에 이번 프로젝트에서 Private 저장소를 만들어 사용했습니다.
3. 프로젝트의 Root 경로에 DockerFile 생성
여기서 DockerFile은 도커에 존재하는 이미지를 기반으로 하여 내가 작성한 스크립트 파일을 통해 나만의 이미지를 생성할 수 있는 파일입니다. 즉, 저는 여기에 필요한 Docker 이미지를 골라 담아서 제가 만들고 있는 서버에 필요한 이미지를 생성하는 DockerFile을 생성했습니다.
# Node Base Image
FROM node:16-alpine
# RUN mkdir -p /app
WORKDIR /app
# Current Local . to /app/
ADD . /app/
# install Library
RUN npm install
# Build
RUN npm run build
# PORT
EXPOSE 8080
# Start
ENTRYPOINT npm run start:prod
먼저 저는 Node 16 버전을 Base로 해서 Application을 실행시키고 있기 때문에 Base 이미지를 Node의 16 버전을 사용합니다.
RUN, CMD, COPY 등이 실행되는 기본 경로를 WORKDIR로 "/app"으로 설정합니다.
ADD 명령어를 통해 현재 프로젝트 경로(.)에 있는 소스파일을 WORKDIR로 설정한 도커의 경로(/app/)로 복사합니다.
이제 순서대로 npm 라이브러리를 설치하고, build를 진행합니다.
EXPOSE를 통해서 도커 컨테이너가 실행되었을 때, 요청을 기다리고 있을 Listen 포트를 8080으로 지정합니다.
마지막으로 ENTRYPOINT 명령어를 통해서 컨테이너가 생성되고, 최초로 실행될 때 수행하는 명령어를 설정하고 마무리합니다.
4. EC2 서버에서 실행할 스크립트 파일 생성
기존에 작성했던 배포 스크립트에서는 Git을 통해 EC2로 직접 Pull 하여 코드를 통합하고, Build 하는 과정도 모두 EC2에서 진행했었습니다. 하지만 이제 코드 통합과 Build는 DockerFile에 설정된 대로 Github Actions에서 진행하여 Docker Hub의 Private 저장소로 저장하게 됩니다.
즉, 이제 EC2에서는 이 Private Docker Hub 저장소에 있는 이미지를 가져와서 실행만 시켜 Deploy 과정을 마무리하는 스크립트를 실행하면 완료됩니다.
Github Actions에서 코드 통합, Build를 거친 새로운 Docker Image를 가져옵니다.
현재 실행되고 있는 컨테이너는 종료하고, 기존의 컨테이너와 이미지는 모두 삭제합니다. (계속 누적되는 것을 방지)
새롭게 가져왔던 이미지를 실행시키고 배포를 완료합니다.
5. Github Actions WorkFlow 설정
이제 DockerFile까지 설정을 완료했기 때문에 Github Actions를 통해서 제가 설정한 DockerFile대로 이미지를 만들어 제 Private Docker Hub 저장소에 이미지를 올리고, SSH로 EC2에 접속하여 새롭게 작성한 start-docker.sh 스크립트 파일을 실행할 수 있도록 Github Actions WorkFlow를 설정해야 합니다.