이슈 상황
기존에 있던 dockerfile 을 수정한 다음 docker-compose up 를 했는데도 불구하고 이미지에 변경사항이 반영 안 되고 기존의 이미지로 빌드되었다.
Dockerfile 변경 전
변경 전 Dockerfile
FROM python:3.9-alpine3.13
LABEL maintainer="shawn"
# python 출력 내용을 버퍼에 넣지 않고 바로 출력 => 로그 바로바로 보임
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /tmp/requirements.txt
COPY ./requirements.dev.txt /tmp/requirements.dev.txt
COPY ./app /app
WORKDIR /app
EXPOSE 8000
ARG DEV=false
RUN python -m venv /py && \
/py/bin/pip install --upgrade pip && \
/py/bin/pip install -r /tmp/requirements.txt && \
if [ "$DEV" = "true" ] ; then \
/py/bin/pip install -r /tmp/requirements.dev.txt ; \
fi && \
rm -rf /tmp && \
adduser \
--disabled-password \
--no-create-home \
django-user
ENV PATH="/py/bin:$PATH"
USER django-user
Docker
복사
docker-compose.yml
version: '3.9'
services:
app:
build:
context: . # dockerfile 이 있는 경로
args:
- DEV=true # DEV 환경변수 true 로 설정
ports:
- '8000:8000'
volumes:
- ./app:/app
command: >
sh -c "python manage.py runserver 0.0.0.0:8000"
environment:
- DB_HOST=db # service 이름
- DB_NAME=devdb
- DB_USER=devuser
- DB_PASS=devpass
depends_on:
- db # db 서비스가 먼저 실행되도록 설정
db:
image: postgres:13-alpine
volumes:
- dev-db-data:/var/lib/postgressql/data
environment:
- POSTGRES_DB=devdb
- POSTGRES_USER=devuser
- POSTGRES_PASSWORD=devpass
volumes:
dev-db-data: # docker-compose 가 default 값으로 세팅해줌
YAML
복사
컨테이너 띄우기
$ docker-compose up
Bash
복사
db image 를 pull 한 다음, app Dockerfile 을 읽어서 build 한다.
app 컨테이너와 db 컨테이너 가 잘 올라갔다.
여기까지는 문제가 없다
이제 Dockerfile 을 수정해보자.
Dockerfile 변경 후
변경 후 Dockerfile
FROM python:3.9-alpine3.13
LABEL maintainer="shawn"
# python 출력 내용을 버퍼에 넣지 않고 바로 출력 => 로그 바로바로 보임
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /tmp/requirements.txt
COPY ./requirements.dev.txt /tmp/requirements.dev.txt
COPY ./app /app
WORKDIR /app
EXPOSE 8000
ARG DEV=false
RUN python -m venv /py && \
/py/bin/pip install --upgrade pip && \
# 추가한 부분
apk add --update --no-cache postgresql-client && \
apk add --update --no-cache --virtual .tmp-build-deps \
build-base postgresql-dev musl-dev && \
/py/bin/pip install -r /tmp/requirements.txt && \
if [ "$DEV" = "true" ] ; then \
/py/bin/pip install -r /tmp/requirements.dev.txt ; \
fi && \
rm -rf /tmp && \
apk del .tmp-build-deps && \
adduser \
--disabled-password \
--no-create-home \
django-user
ENV PATH="/py/bin:$PATH"
USER django-user
Docker
복사
postgresql adaptor 로 psycopg2 를 사용할건데, psycopg2 를 사용하기 위해서는 또 다른 외부 패키지를 설치하야 한다. 외부 패키지 설치 커맨드를 도커파일에 추가하였다 ( psycopg2-binary 가 아닌 psycopg2 )
docker-compose.yml 파일은 동일하다
$ docker-compose up
Bash
복사
이슈 : Dockerfile 을 변경했지만 이미지가 새로 빌드 되지 않고, 기존 이미지를 재사용한다
이슈 원인 및 해결
docker-compose up 명령어는 기존 이미지가 존재할 시에, 이미지를 재빌드하지 않는다.
따라서 기존에 이미지가 있다면 Dockerfile 이 수정되었더라도 이미지에 변경사항이 적용되지 않는다.
해결법은 아래와 같다
방법1
$ docker-compose build
$ docker-compose up
Bash
복사
build 를 한 다음, up 을 한다.
방법2
더 간단한 방법은 docker-compose up 에 --build 옵션을 붙히면 된다.
$ docker-compose up --build
Bash
복사
그래도 안 되는 경우
build 를 해도 Dockerfile 의 변경사항을 캐시로 처리해서 변경이 제대로 안 되는 경우가 있을 수 있다.
그럴 때는 이미지 빌드 시 캐시를 사용하지 않도록 옵션을 붙혀주면 된다.
$ docker-compose up --force-recreate
Bash
복사
아니면 아예 로컬에 있는 캐시를 싹 다 삭제하는 방법도 있다.
참고