Dockerfile

malza_0408·2022년 4월 12일
0

기록

목록 보기
2/4
FROM python:3.8-alpine
COPY . /app
WORKDIR /app
RUN pip3 install flask
RUN chmod +x /app/app.py
CMD ["python3", "app.py"]

FROM

FROM은 어떤 리눅스를 사용할 것인지에 대한 것이다.
즉, 어떤 베이스 이미지를 사용할 것인가?
python인지, node인지, java인지 등에 따라 여러 OS버전이 있다.

python docker image 검색하면 사용가능한 이미지가 좌르르르르르륵

COPY

COPY는 말 그대로 파일을 복사한다.

. 과 /app 두 부분으로 되어 있다.
. 은 현재 디렉토리이다.
/app은 이미지 안에서 어떤 경로에서 시작될 것인가를 정한다.
현재 디렉토리의 소스코드를 app디렉토리에 copy하라는 뜻이다.

WORKDIR

WORKDIR은 컨테이너가 실행되었을 때 시작점이다.
/app에 소스코드를 copy했기 때문에 /app에서 명령어를 실행한다.

RUN

RUN은 컨테이너를 구성할 파일을 만들 때 사용한다.
즉, 이미지를 만들 때 실행하는 명령어다.
flask를 설치하고, app.py의 권한을 바꿔주는 명령이 실행 되었다.

node 환경일때?

RUN npm install
을 작성 할 수 있을텐데 install을 하게 되면 package.json에 명시되어 있는 라이브러리가 최신버전이 나왔다면 해당 버전으로 설치 해 버린다. 이를 package-lock.json 버전으로 다운받게 하기 위해서는
RUN npm ci
라고 작성하는게 좋다.

CMD

CMD는 컨테이너가 실행된 후에 실행할 명령어다.
여기선 app.py를 실행하여 flask app을 실행하라 이다.

ENTRYPOINT

CMD와 마찬가지?로 명령어 실행

Layer

도커파일은 위처럼 layer형태로 작성하게 된다.
FROM 부터 Layer0...
COPY Layer1...
WORKDIR Layer2...

또한 도커파일 작성시에는 제일 빈번히 발생하는 것일수록 아래쪽에 적어야 한다.
Layer 4,5 .. 이런애들이 이제 가장 빈번하게 변경 될 가능성이 높은 친구들이다.
소스파일이 변경되어서 새로운 이미지를 만들어야 할 때 변경된 최상단의 Layer만 변경해주면 되기 때문이다. 변경되지 않았다면 cache된 레이어를 사용한다.

이미지 build

docker build -f Dockerfile -t test-docker .

.

마지막의 . 은 build context라고 불리는 녀석이다. 도커에네 건네줄 이미지가 현재 최상위 경로에 있는 것을 의미한다. 도커는 이것을 알아듣고 Dockerfile을 찾을 것이다.

-f

어떤 Dockerfile을 사용할 것인지 명시한다. 파일 이름을 보통 Dockerfile이라고 명시하지만 다른 이름으로도 가능하다.

-t

이미지에 이름을 붙여준다. 태그와 비슷한 개념이다.

build된 이미지로 container 실행

docker run -d -p 5000:5000 test-docker

-d

서버는 background에서 계속 돌아가야 하기때문에 터미널이 얘를 잡고 기다려야 한다. 서버는 돌리고 터미널은 이제 자기 할 일 하라고 해준다.

-p

포트 지정한다. 호스트 포트(5000):컨테이너 포트(5000)

Dockerhub에 push

Dockerhub에서 create Repository를 하고 test-react 라는 이름으로 만들게 되면
malza0408/test-react
와 같이 내 계정/이름 과 같은 형태로 만들어진다.
그리고 해당 repo에 올리기 위해선 build해서 만들었던 이미지 test-docker의 이름이 repo저장소의 이름 malza0408/test-react와 같아야 한다.

tag

tag 명령어로 이미지의 이름을 바꿀 수 있다.
docker tag test-docker:latest malza0408/test-react:latest

docker login으로 도커에 로그인해주고
docker push malza0408/test-react:latest 해주면 완료!

heroku container:login
heroku container:push web
heroku container:release web
heroku open
profile
그냥 개인적으로 공부한 글들에 불과

0개의 댓글