반응형

docker-compose 같은경우 기준이 되는 image를 선택할 때, image라는 속성을 사용할 수도 있지만,

build라는 속성을 이용하여, Dockerfile을 지정해줄 수가 있다.


예) docker-compose.yml (image)

db:
  image: mysql/mysql-server:latest         # dockerhub에 있는 image를 가져오는 경우


예) docker-compose.yml (Dockerfile이 abcd/Dockerfile 경로에 있는 경우)

db:
  build: ./abcd


docker-compose가 아직 Dockerfile이 가지고 있는 기능 전체를 지원하진 않기 때문에,

디테일한 기능들도 컨트롤 하기 위해서는, build 속성을 많이 사용하는 것 같다.


다만, 이 방식의 경우 volume을 컨트롤하는 데 문제가 하나 있다.


docker-compose의 volumes 속성을 이용해서, 폴더 단위로 link를 걸었을 때는 문제가 없지만,

docker-compose가 build 속성에 명시되어 있는 Dockerfile을 참조하는 과정에서 Dockerfile에 ADD나 COPY 구문이 들어있는 경우에 문제가 발생한다.


문제가 되는 케이스는 아래와 같다. (Nginx webroot에 파일을 추가하는 경우)


1. docker-compose를 이용하여, 최초에 image, container를 생성한다. (정상적으로 파일 ADD, COPY가 이루어짐)


2. 수정사항이 발생하여 파일을 수정 및 추가하여, docker-compose를 통해 container를 재배포한다. (반영되지 않음)


3. docker-compose를 통해 생긴 image, container를 삭제하고, 재생성 후 다시 배포한다. (정상적으로 반영)


아마 docker image를 docker-compose가 자체적으로 caching하고 있어서 발생하는 문제가 아닐까한다.


이런 경우 아래 예시 처럼 docker-compose에 volumes 속성을 사용하여, 폴더째로 link 시켜버리는 게 편한 것 같다.

예) docker-compose.yml (volumes)

db:
  build: ./abcd
  volumes: ./nginx_files:/var/www/html


이런식으로 링크를 걸어두면 host 머신에 있는 nginx_files 경로에 어떤 파일을 넣고, 빼면 container 안에 있는 /var/www/html 에도 즉시 반영이 되게 되어,

파일 배포 시에 docker-compose build라던지 할 필요가 없어지게 된다.


단, .dockerignore파일을 이용하여 메타정보 등의 파일을 빼고 배포시키는 등의 기능은 아직 docker-compose에서는 미지원하는 것 같다.

적절하게 잘 섞어서 쓰면 좋을듯..

반응형
,