본문 바로가기

Infra

[Infra] npm Unable to authenicate 에러, npm ERR! code401, .npmrc 에러

현재 관광데이터 활용 공모전에 참가중입니다.
저는 인프라, 백엔드를 맡았습니다.

오늘은 배포 과정에서 있었던 문제에 관해 포스팅 해보겠습니다.

 

문제

문제는 프론트엔드 프로젝트 빌드 중 일어났습니다.

 

배포 실패 알림이 왔고 Jenkins를 확인해 보았습니다.

 

 

보면 npm install을 하던 도중 authenticate 관련 오류가 발생한것을 확인할 수 있었습니다.

 

프론트엔드의 Dockerfile은 다음과 같이 작성되어 있었습니다.

FROM node:18.17.1-alpine AS builder

# 컨테이너 내부 작업 디렉토리 설정
WORKDIR /usr/src/app

# 컨테이너 내부로 package.json 파일들 복사
COPY package* .

# package.json 및 package-lock.json 파일에 명시된 의존성 패키지들을 설치
RUN npm install

# 소스를 작업폴더로 복사하고 빌드
COPY . .

RUN npm run-script build
CMD [ "npm", "start" ]

 

프론트엔드 프로젝트는 React로 되어있습니다.

Dockerfile의 내용은 package.json, package-lock.json을 copy 후 정보를 토대로 npm install 후 실행하는 과정입니다.

사실 지금까지 프론트엔드를 맡아서 할 때 npm install을 할 때 인증정보가 필요했던 기억도 없고, 팀원에게 전달받은 내용도 없어서 많이 당황했습니다.

 

이에 로컬에서 실행을 해보았습니다.

 

오류가 터지지 않고 잘 실행이 되었습니다.

이것으로 보아 문제는 로컬 환경과 인스턴스 내부 환경이 다른 부분에서 발생한다고 생각하게 되었습니다.

 

프로젝트 내부를 살펴봤고 처음보는 파일을 발견했습니다.

 

파일의 이름은 .npmrcauthToken등의 내용이 들어가 있었습니다.

늦은 시간이라 팀원은 연락이 안되었기에... 위의 내용을 토대로 추측한 내용은 이렇습니다.

팀원이 npm의 특정 라이브러리를 사용하려 하였고 그것을 설치하기 위해서는 .npmrc에 있는 토큰 정보가 필요하다.

가설을 세우고 문제를 해결해보았습니다.

 

문제 해결

 

해결 방법은 .npmrc파일을 복사하는 것  이었습니다.

 

현재 제 프론트엔드 Dockerfile은 package.json, package-lock.json의 정보만을 토대로 npm install을 진행합니다.

하지만 npm install을 하는 과정에서 .npmrc의 토큰정보가 추가로 필요합니다. 그렇기 때문에 로컬에서는 제대로 되었지만 빌드시에는 제대로 되지 않았던 것 입니다.

 

이에 다음과 같이 Dockerfile을 수정하였습니다.

FROM node:18.17.1-alpine AS builder

# 작업 디렉토리를 /usr/src/app으로 설정
WORKDIR /usr/src/app

# .npmrc 파일과 package.json 파일들을 컨테이너 내부로 복사
COPY .npmrc ./
COPY package* ./

# 의존성 패키지들을 설치
RUN npm install

# 소스 코드 전체를 컨테이너 내부로 복사
COPY . .

# 빌드 실행
RUN npm run-script build

# .npmrc 파일을 삭제 (보안을 위해 빌드 후 삭제)
RUN rm -f .npmrc

# 기본적으로 npm start 명령어를 실행하도록 설정
CMD [ "npm", "start" ]

 

COPY .npmrc를 추가하였습니다.

package.json등을 복사하면서 .npmrc도 추가로 복사하는 것 입니다.

Dockerfile을 수정 후 테스트를 진행하였습니다.

 

 

성공적으로 해결된 것을 확인하였습니다.

 


초보 개발자의 글이라 부족한 점이 많습니다. 잘못된 점 등을 말씀해주시면 감사히 받겠습니다.