ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배포 - Dockerfile를 이용해서 Docker image build
    Infra/CI-CD 2022. 12. 25. 15:25

    package.json이 없다고 나오는 이유 (dockerfile copy)

    앞으로 만들어야 할 dockerfile 완성본을 보면 COPY라는 것이 존재한다. 왜 이 COPY가 필요한지 package.json문제를 해결하면 서 알아본다.

    Dockerfile로 이미지를 만들때 Node 베이스 이미지를 사용을 해서 임시 컨테이너를 만든 다음에 임시 컨테이너로 실제 사용을 할 이미지를 만드는 것인데 Node 베이스 이미지를 임시컨테이너로 만들때 파일 스냅샷들이 존재한다. home, bin, dev 디렉토리 같이 많은 것들이 존재한다.

     

    그래서 베이스 이미지에서 파일 스냅샷들을 임시컨테이너에 하드디스크에 먼저 넣어준다. 그 다음 FROM 명령어에 따라 컨테이너에 node:10 이미지를 먼저 넣는다. 그리고 그다음 Dockerfile에 있는 RUN 명령어에 따라 npm install을 해주게 되는데, 그때 package.json 파일이 없어서 error가 발생하는 것이다.

     

    npm install은 package.json은 내용을 기반으로 어떠한 종속성을 설치해야하는 지 파악하고 해당하는 종속성을 설치하기 때문이다.

     

    근데 임시컨테이너 안에는 package.json이 있지 않고,  컨테이너 밖에 있다. 더 자세히 설명하자면, Node 베이스 이미지에 해당하는 파일 스냅샷이 임시 컨테이너의 하드디스크로 들어오는데, Node 베이스 이미지에 파일 스냅샷 안에package.json이 들어 있지 않다.

     

    package.json와 server.js 사용자가 임의로 만든 node app의 요소이기 때문이다. 

     

    package.json을 컨테이너에 복사

    그렇기 때문에 사용자가 임의고 만든 file들의 경우는 Dockerfile의 COPY명령어를 사용해서 임시 컨테이너 않에 넣어주어야 한다.

     

     

    COPY 명령어 추가

    FROM node:10
    
    COPY package.json ./
    
    RUN npm install
    
    CMD ["node","server.js"]

    경로는 Dockerfile이 있는 경로를 기준으로 작성한다.

     

    RUN 명령어와 CMD 명령어의 차이는 RUN의 경우는 도커 이미지가 빌드되기 전에 수행되는 쉘 명령어이고, CMD의 경우는 CMD의 경우는 도커 컨테이너 실행과 동시에 실행될 파일이과 그 파일을 실행할 셀 스크립트라는 것이다. 또한 CMD의 경우 도커파일 내에 한번만 사용할 수 있다.

     

    경로에 있는 App을 구성하는 모든 file 복사 

    FROM node:10
    
    COPY ./ ./
    
    RUN npm install
    
    CMD ["node","server.js"]

    Dockerfile을 기준으로 현재 디렉토리에 있는 모든 file을 Docker Container안에 복사한다.

     

    image 빌드

    성공적으로 Docker image가 build 된것을 확인할 수 있다. 

     

    image run

     

    server.js

    const express = require("express");
    
    //Constants
    const PORT = 8070;
    
    //App
    const app = express();
    app.get("/", (req, res) => {
      res.send("Hello World");
    });
    
    app.listen(PORT);
    console.log(`Server is running`);

    docker run 명령어로 새로 build한 image를 Container화 시켰을때 서버가 잘 돌아간다는 증거로 console.log('Server is running'); 에 해당하는 메시지가 터미널에 잘 찍히는 걸 확인 할 수 있다. 

     

     

    [출처 -  https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8F%84%EC%BB%A4-ci/dashboard]

     

    댓글

Designed by Tistory.