0ju-log
💻 Frontend

[DevOps] yarn berry + Docker 마이그레이션

💡 시작하기

yarn berry로 마이그레이션을 진행한 이후, Docker 환경에서 빌드를 수행하는 과정에서 오류가 발생하였다. 알고 보니 yarn classic과 yarn berry는 의존성 관리 방식 자체가 다르기 때문에, 기존에 사용하던 Docker 설정을 그대로 사용할 수 없었다.

이에 따라 Docker 환경에서도 yarn berry에 맞게 빌드 과정과 설정을 수정하게 되었다!

(11월에 진행한 태스크를 2월이 되어서야 올린다 허허)

🔥 트러블 슈팅 1

ERROR: failed to build: failed to solve: process 
"/bin/sh -c 
if [ -f yarn.lock ]; then yarn --frozen-lockfile;     
else echo \"Lockfile not found.\" && exit 1;     
fi" 
did not complete successfully: exit code: 1

yarn berry로 바꾼 후 CI를 새로 구축하였는데 도커를 빌드하는 과정에서 오류가 생겼다.

왜 이런 오류가 났을까?

yarn berry에서는 --immutable 옵션을 사용해야 lockfile과 설치 상태의 불일치를 정확히 검증할 수 있는데, 기존 CI 설정을 그대로 가져오면서 yarn classic 기준 옵션이 남아 있어 빌드 단계에서 실패가 발생했다.

해결 방법

RUN yarn install --immutable

RUN \
    if [ -f yarn.lock ]; then yarn run build; \
    else echo "Lockfile not found." && exit 1; \
    fi

Yarn Classic에 맞춰져 있던 로직을 Yarn Berry에 맞게 수정해주었다

🔥 트러블 슈팅 2


ECS에 배포하니까 다음과 같은 에러가 떴다

알고보니 node_modules랑 관련된 에러였다

yarn berry로 바꿔서 node_modules가 존재하지 않게 되었으나 cd에서는 node_modules가 웬만하면 있어야 오류가 안 난다고 한다.

⇒ yarn berry의 nodeLinker를 도커에서 빌드하는 과정에서만 node_modules로 설정하여 도커가 생성한 이미지에만 node_modules가 존재하도록 수정하였다

RUN yarn config set nodeLinker node-modules
RUN yarn install --immutable

윗 줄 추가하니까 와아 성공~!


yarn classic과는 다른 패키지와 구성이 있었기에 Dockerfile에서 수정을 많이 해야했다

🖥️ Dockerfile에서 수정한 부분

# stage 1에 추가한 내용

COPY package.json yarn.lock .yarnrc.yml ./
COPY .yarn ./.yarn

RUN corepack enable
RUN yarn set version berry
RUN yarn install --immutable

# Stage 2에 추가한 내용

COPY --from=deps /app/.pnp.cjs /app/.pnp.cjs
COPY --from=deps /app/.yarnrc.yml ./.yarnrc.yml

COPY . .

ENV NODE_OPTIONS="--require=/app/.pnp.cjs"
RUN yarn install --immutable

📝 결과 및 정리

yarn berry로 마이그레이션을 진행하면서 도커의 이미지 용량이 꽤 많이 압축되었다 :)

yarn berry는 node_modules 의존성을 제거하여 저장 공간을 줄이고, 의존성 관리의 일관성을 높일 수 있다는 장점이 있다. 그러나 실제 배포 환경에서는 여전히 node_modules 구조를 전제로 동작하는 경우가 많아, Docker 빌드 과정에서만 node_modules를 생성하도록 설정하는 방식을 선택하게 되었다.

이 과정은 yarn berry의 철학과는 다소 아이러니하게 느껴졌지만, 운영 환경의 안정성을 고려했을 때 현실적인 선택이었다고 판단한다.

이 부분에 대해서는 내가 알고 있는 yarn berry에 대한 정보가 약하다고 생각한다. 따라서 추후에는 PnP 환경을 보다 자연스럽게 배포에 적용할 수 있는 방법을 더 찾아볼 예정이다 :)

🔗 참고