나는 Web Server의 역할을 하는 Next.js와
API Server역할을 하는 Express를
각각의 이미지로 만들어, 두개의 컨테이너를 실행시키려고 한다.
express의 경우, 간단한 DockerFile을 만들고, 프로젝트 레포지토리에 같이 push하면 된다.
Jenkins가 DockerFile을 읽어서, 이미지를 생성하고,
express server 구동에 필요한 환경변수는 docker run 명령어에 -e 옵션으로 넘겨주면 된다.
(물론 필요한 환경변수는 DockerFile이 아니라, Jenkins Workspace에 저장되어 있다.)
반면, Next.js의 경우 상황이 좀 어렵다.
Next image를 생성하기 위한 DockerFile은 다음과 같다.
...
run npm run build
run npm start
...
Next는 build 시점에, ServerSideProps 함수를 동작시켜, 미리 data를 fetch한 후, HTML 페이지를 렌더링 한다. 만약 data fetch URL이 환경변수로 되어있다면!, build 시점에 환경변수를 가지고 있어야 한다.
express의 경우 docker run -e 형태로 Container를 구동시킬 때 넘겨주면 되었지만, next의 경우는 docker run 시점에 환경변수를 넘겨주는 것이 무의미하다.
따라서 build 시점에 환경변수를 들고 있어야 되는데, DockerFile에 env를 넣어두고 Github에 push한다는 것은 매우 위험한 일이다.
이것을 해결하기 위한 방법이 무엇일까 많은 고민을 했다.
5주짜리 프로젝트가 1주일도 안남은 시점에서, 솔직히 단계가 너무 많아서 엄두가 안난다. 지금 반쪽 짜리 CI/CD를 그대로 쓰고 싶은 마음이 굴뚝같지만, 대충 한것은 안한 것만도 못해보이니.. 해내야 된다..
이래서 사람들이 DinD, DooD 처럼 Jenkins 자체도 image로 만드는가 싶다.. 힘드니까 나중에 돌려쓰려고