본문 바로가기

직접 만든 소프트웨어, 두 가지 개발 기록

구현 구조와 적용 범위, 확인한 기능과 남은 한계를 함께 기록합니다.

소프트웨어개발

Compose exec가 CI에서 TTY 오류일 때: -T와 표준입력 구분

by 아빠띠띠뽀 2026. 10. 30.

CI에서 Compose exec가 the input device is not a TTY로 멈추면 대화형 터미널 할당이 필요한지 먼저 확인하세요. Compose exec는 기본적으로 TTY를 할당하므로 비대화형 실행은 -T를 검토하고 표준입력 사용 여부는 따로 결정해야 합니다.

적용 환경: Docker Compose V2의 exec와 실행 중인 서비스; Compose 프로젝트와 Docker 데몬 접근 권한 필요, Windows Git Bash·구형 docker-compose V1은 별도 진단. 자료 확인일: 2026-10-29. 공식 문서 기반 안내이며 실제 계정·운영 환경에서 실행한 시험 결과가 아닙니다.

1. 원인: 로컬 터미널과 CI 입력 환경이 다르다

Docker 공식 문서는 Compose exec가 기본적으로 대화형 모드와 TTY를 사용한다고 설명합니다. 반면 docker exec는 -i와 -t를 명시하는 방식입니다. 둘의 옵션 기본값을 같다고 보고 명령을 옮기면 자동화 환경에서 차이를 만날 수 있습니다.

TTY는 터미널 동작을 위한 설정이고 표준입력을 열어 두는 것과는 구분됩니다. 키보드로 조작할 셸인지, 입력 없이 한 번 실행하고 종료할 명령인지, 파이프로 데이터를 전달할 것인지부터 적습니다. 이 오류만 보고 컨테이너 권한이나 소켓 접근 설정을 바꾸지 마세요.

2. 해결: 서비스와 입력 요구를 먼저 확인

기존 Compose 파일을 사용하는 디렉터리에서 서비스 이름과 실행 상태를 확인합니다. app은 실제 서비스 이름으로 바꾸세요. pwd는 현재 작업 디렉터리를 출력하는 작은 예시이며, 컨테이너에 해당 실행 파일이 있어야 합니다.

docker compose version
docker compose ps
docker compose exec -T app pwd

표준입력이 전혀 필요 없는 스크립트라면 공식 문서가 설명하는 --interactive=false를 함께 검토할 수 있습니다. 입력이 필요한 명령에 이를 무작정 추가하면 필요한 데이터가 전달되지 않을 수 있습니다.

실행 목적 검토할 조건
대화형 셸 조작 실제 터미널과 TTY 필요 여부
입력 없는 단일 명령 -T와 필요 시 interactive 비활성화
파이프 입력 전달 TTY와 STDIN 요구를 각각 확인
서비스가 실행되지 않음 exec 입력 문제와 별도 원인 조사

3. 확인: 작은 명령의 종료와 실제 작업을 구분

CI에서 작은 조회 명령이 끝나면 종료 코드와 출력을 기록합니다. 그다음 원래 작업이 표준입력·작업 디렉터리·사용자·실행 파일 중 무엇을 요구하는지 대조하세요. pwd 성공은 DB 변경이나 배포 명령도 성공한다는 증거가 아닙니다.

프로젝트 파일이나 -p/-f 조건을 달리하면 다른 서비스에 접근할 수 있으므로 로컬에서 썼던 조건을 유지합니다. 애플리케이션이 없는 명령이나 잘못된 서비스 이름을 TTY 옵션만으로 해결할 수는 없습니다. 이 글은 실행 중인 컨테이너를 대상으로 하며 새 컨테이너를 만드는 run과 구분합니다.

4. 주의와 FAQ

Compose의 -T를 docker exec에도 쓰나요? 같은 옵션이라고 복사하지 마세요. docker exec의 TTY 옵션은 -t이며 기본적으로 할당하지 않습니다. 현재 사용하는 명령의 도움말을 기준으로 확인합니다.

권한을 늘리면 TTY 오류가 해결되나요? 터미널 입력 조건과 권한 문제는 다릅니다. --privileged를 추가하거나 소켓 권한을 넓히는 처리를 기본 해결책으로 사용하지 않습니다. 여기의 예시는 문서 확인이며 실제 Docker·CI 시험 결과는 아닙니다.

공식 출처와 관련 글

Compose exec의 TTY와 interactive 기본값

Docker exec의 TTY·STDIN과 실행 조건

실행 상태와 서비스 준비 완료를 구분하는 점검

명령에 필요한 입력과 실행 결과를 나누어 살피는 개념 그림
직접 생성한 개념 이미지입니다. 실제 서비스 화면이나 구축·성능 시험 결과가 아닙니다.