본문 바로가기

Proj/Tripot

Trouble Shooting - docker compose vs docker-compose

1. 개요

해당 포스팅의 제목이 Tripot 프로젝트를 진행하면서 발생한 오류의 원인이 되었다. 이번에는 두 명령어 간의 차이를 알아보고, 해당 실수가 어떤 결과를 초래하였는지 정리해보자.

2. docker compose vs docker-compose

 본론으로 들어가서 두 명령어가 어떤 차이점이 있는 지 정리해보자. 처음 이를 학습할 때는 둘 중 어떤 명령어를 사용해도 up 명령어가 정상적으로 동작하기에 차이가 없다 생각하고 넘겼었다. 하지만 다음과 같은 차이점이 존재한다.

  Compose V2 Compose V1
명령어 docker compose docker-compose
개발 언어 python go
word separator -(hyphen) _(underscore)
scale 옵션 docker compose up --scale docker-compose scale
rm -all (deprecated) docker-compose rm --all

 

이외에도 Compose V2는 환경 변수를 읽어들이는 법이 좀 더 일관성있게 변경되었다.

 

3. 발생했던 문제

 무중단 배포를 구축하던 중이었다. 스크립트를 모두 작성하고 실행하는 데, 운영 컨테이너에서 mysql과 연결이 안되는 문제가 발생했다.

access denied for user 'root'@'localhost' (password:yes)

 

 처음에는 이를 환경 변수 등에 문제가 있다 생각하여 모두 확인을 해봤다. 그러다 느낀 이상한 점은 개발 서버는 비슷한 조건에서 잘 돌아가는데 운영 서버만 문제가 생겼다는 것이다. 이를 해결하기 위해 두 서버간에 어떤 차이가 있는지 compose 파일도 바꿔보고, mysql에 계정도 생성해봤는데 문제는 따로 있었다.

 다음은 docker-compose-common.yml을 실행시키기 위한 명령어이다.

docker compose -f docker-compose-common.yml --env-file ./dev.env up -d

 그리고 스크립트에 작성했던 운영 서버 실행 명령어는 다음과 같다.

docker-compose -f docker-compose-prod.yml --env-file ./prod.env up -d

 

 이처럼 Compose V1과 Compose V2를 혼용하면 전혀 다른데서 오류를 발생시켜 이를 해결하는 데 예상보다 더 오래 걸릴 수 있다.

 

 절대 Compose V2와 V1을 혼용하지 말자

 

 언젠가 필자와 같은 실수로 고생할 사람이 나올 수도 있기에 이 포스팅을 남긴다.