Search

[docker] 도커파일을 수정해도 이미지에 반영이 안 되는 이슈

타입
트러블슈팅
태그
docker
docker-compose
상태
Published
생성일
2023/01/12 17:48
최종 편집 일시
2023/07/18 01:47
2 more properties

이슈 상황

기존에 있던 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 을 변경했지만 이미지가 새로 빌드 되지 않고, 기존 이미지를 재사용한다

이슈 원인 및 해결

1487
issues
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
복사
아니면 아예 로컬에 있는 캐시를 싹 다 삭제하는 방법도 있다.
참고