본문 바로가기

잡다/docker

[docker] 오늘의 삽질 : permission denied, mkdir '/app/node_modules/.cache'

도커 관련 강의를 들으며 리액트 프로젝트를 도커 이미지로 만드는데, 다음과 같은 에러가 발생했다.

EACCES : permission denied 에러

당시 내가 사용한 도커파일 코드는 다음과 같다.

FROM node:alpine

WORKDIR '/app'

COPY package.json .

RUN npm install
COPY . .

EXPOSE 3000
# 어떤 포트로 내보낼 것인가에 대한 일종의 약속에 불과함. 실제 포트 연결이 필요하다면 run -p 외부:내부 를 이용.
CMD ["npm", "run", "start"]

 EACCES 는 대략 엑세스 문제가 발생했다는 에러로, 현재 상태에서는 /app/node_modules/.cache 파일에 문제가 있는 것으로 보인다. mkdir을 통해 파일을 생성하는 것을 권장하는 것으로 보아, 실제로 파일이 없는 것으로 생각된다.

 해당 폴더는 기존에 만들었던 실제 폴더에는 존재하나, 모종의 이유로 도커 컨테이너 내에서는 생성되지 않았다.

원 코드 상에서는 접근할 수 있다.

 도커 컨테이너가 실행중인 상태에서 docker exec -it <container_id> sh 명령을 통해 컨테이너 환경에 접속한 후, ls 명령을 통해 .cache 폴더를 찾아보았으나, 해당 폴더는 존재하지 않음을 알 수 있었다.

 

해결책

도움을 받은 글 : https://stackoverflow.com/questions/67187750/docker-eacces-permission-denied-mkdir-app-node-modules-cache

 결론부터 말하자면, 이 에러는 Dockerfile을 생성할 때 사용한 base 이미지인 node:alpine 환경에서의 권한 차이에 의해 발생한다. 어떤 이유에선가 해당 이미지 환경에서는 우리가 접근하고 싶은 /app/node_modules/.cache 파일에 접근할 권한이 없다. 따라서 /node_modules에 대해 유저가 접근할 수 있게 하면 된다.

 도커파일 코드를 다음과 같이 수정한다.

FROM node:alpine
# 변경점 1) WORKDIR 이 /home/node/app 으로 바뀜
WORKDIR '/home/node/app'
# 변경점 2) node_modules 을 미리 만들고, 소유권을 변경함.
RUN mkdir node_modules
RUN chown -R node:node ./node_modules

COPY package.json .

RUN npm install
COPY . .
# 변경점 3) 사용할 유저를 지정.
USER node

EXPOSE 3000
# 어떤 포트로 내보낼 것인가에 대한 일종의 약속에 불과함. 실제 포트 연결이 필요하다면 run -p 외부:내부 를 이용.
CMD ["npm", "run", "start"]

 현재 해결방법은 유저를 생성하고, 해당 유저에게 node_modules 폴더의 소유권을 부여하는 방식으로 진행된다. 우선 1) WORKDIR을 node 유저의 홈 폴더로 지정하고, 2) 해당 폴더 내에 node_modules 파일을 생성 + 소유권을 부여한 후, 3) 도커에서 사용할 유저를 node로 지정한다.

 리눅스 환경에서 각 유저 소유의 파일은 보통 /home/유저 경로에 위치한다. 이때 이외의 경로(기본 경로) 에 대해 /app 폴더를 만들도록 ( WORKDIR '/app' ) 하고 명령을 수행했을 때는 동일하게 에러가 발생했다. 자세한 사항은 알 수 없지만, node 유저의 파일이 아니라고 여기는 것은 아닐까 생각한다.

 에러가 발생하지 않으면 다음과 같은 메시지를 볼 수 있다.

더이상 EACCES 에러가 발생하지 않는다.

 참고한 문서에서는 RUN chmod -R node:node ./node_modules 명령이 RUN npm install 보다 위에 있다. 이 경우 모든 파일의 소유권을 변경하는데 시간이 매~우 오래 걸린다 ( 대략 3분 정도 걸린 것 같다 ). 따라서 반드시 폴더를 먼저 생성 + 권한을 부여한 후 npm install을 수행하자.


결론

 permission denied, mkdir '/app/node_modules/.cache' 에러는 해당 폴더에 대한 유저의 소유권이 없어 .cache 폴더를 만들 수 없는데서 발생한다. 이 문제를 해결하기 위해서는 유저를 생성하고, 해당 유저에게 node_modules에 대한 소유권을 부여해야 한다.