Search
🐳

wurstmeister/kafka 도커 이미지 토픽 자동 생성 설정

Last update:

개요

카프카 도커 이미지 중 bitnami/kafka, wurstmeister/kafka, confluentinc/kafka 등이 많이 쓰이는데, 문서화가 잘 돼있고 사용자가 많은 wurstmeister/kafka를 써보기로 했다.
wurstmeister/kafka 깃헙 README를 읽던 중, 토픽 관련 환경변수를 설정하는 부분이 있었다.
environment: KAFKA_CREATE_TOPICS: "Topic1:1:3,Topic2:1:1:compact"
YAML
복사
토픽을 생성하기 위한 값인데, 각 토픽을 쉼표(,)를 기준으로 구분하기 때문에 토픽이 많아지면 라인이 지나치게 길어지는 문제가 있다. 구분자를 쉼표가 아니라 다른 문자로 바꾸려면 KAFKA_CREATE_TOPICS_SEPARATOR 변수를 설정해줘야 한다. 예를 들어 "$$'\n'"으로 바꿀 경우 줄바꿈을 기준으로 토픽이 생성된다고 한다.
뭔가 낯선데, 먼저 YAML의 문자열 형식, docker-compose escaping rules 그리고  ANSI-C quoting 방식에 대해 알아야 한다.

YAML string

YAML의 문자열 타입은 재앙적인 복잡도를 가지고 있는데, 아래 stackoverflow 글에서 그 내용을 엿볼 수 있다.
위 Q&A의 주요 사용례 위주로만 정리하면 아래와 같다.
대부분의 경우 > 를 사용하자: 내부 줄바꿈이 자동으로 삭제되어 한 줄만 얻게 된다.
key: > Your long string here.
YAML
복사
줄바꿈(\n)을 유지하고 싶은 경우 |를 사용하자
key: | ### Heading * Bullet * Points
YAML
복사
댓글에 팁이 나와있는데, > 표시는 큰 것을 압축해서 작게 만드는 표시로, 줄바꿈을 없애 압축한다고 연상하면 | 기호와 헷갈리지 않을 수 있다.
마지막 줄바꿈이 포함되지 않게 하려면 >- 이나 |-을 대신 사용하자
단어를 붙이지만 눈에만 보이는 줄바꿈을 하고 싶거나 줄바꿈을 명시적으로 \n 표시하고 싶을 때 ""를 사용하자.
key: "Antidisestab\ lishmentarianism.\n\nGet on it."
YAML
복사
JSON output
{ "key": "Antidisestabishmentarianism.\n\nGet on it." }
JSON
복사
\를 삭제하면 띄어쓰기가 된다.
key: "Antidisestab ishmentarianism.\n\nGet on it."
YAML
복사
JSON output
{ "key": "Antidisestab ishmentarianism.\n\nGet on it." }
JSON
복사

ANSI-C Quoting

이 문서에 적힌 것처럼, bash 등의 일부 쉘에서 ANSI C 표준을 따라 특수 문자를 사용하기 위해서는 아래와 같은 형식을 지켜야 한다.
$'string'
$'' 내부의 string은 우리가 흔히 아는 특수문자 \n, \t가 정상 인식된다. Bash에서 테스트해보면, 아래와 같은 결과를 확인할 수 있다.
$ echo 'a\nb' a\nb $ echo $'a\nb' a b
Shell
복사

Docker compose variable (interpolation)

docker compose는 docker-compose.yaml 파일 내부에 ${VAR} 또는 $VAR와 같이 $ 표시가 붙은 문자를 아래에 정의된 변수값으로 치환한다.
1.
호스트 머신의 쉘 환경변수값
2.
로컬 워킹 디렉터리(PWD)나 프로젝트 디렉터리의 .env 파일(또는 --env-file 옵션으로 넘겨진 파일)에 정의된 변수값
아래 명령어로 docker compose 실행 시 치환될 변수값을 확인해보자.
$ docker compose config --environment
Shell
복사
따라서 컨테이너 내부로 순수한 $ 문자를 넘기기 위해서는 docker-compose.yaml 파일에 $$를 사용해 이스케이핑 해줘야 한다.

종합

따라서 컨테이너 내부에 KAFKA_CREATE_TOPICS_SEPARATOR 변수값으로 줄바꿈을 넘길 경우 docker-compose.yaml은 아래처럼 작성해줘야 한다.
environment: KAFKA_CREATE_TOPICS_SEPARATOR: "$$'\n'"
YAML
복사
이제 토픽 리스트를 아래처럼 넘기면 된다.
environment: KAFKA_CREATE_TOPICS_SEPARATOR: "$$'\n'" KAFKA_CREATE_TOPICS: | my-topic-1:1:3 my-topic-2:1:3
YAML
복사

주의

아래처럼 KAFKA_CREATE_TOPICS_SEPARATOR에 쌍따옴표가 없을 경우
KAFKA_CREATE_TOPICS_SEPARATOR: $$'\n'
YAML
복사
JSON 결과물은 아래와 같고,
"KAFKA_CREATE_TOPICS_SEPARATOR": "$$'\\n'"
JSON
복사
아래처럼 쌍따옴표가 있을 경우
KAFKA_CREATE_TOPICS_SEPARATOR: "$$'\n'"
YAML
복사
JSON 결과물은 아래와 같다.
"KAFKA_CREATE_TOPICS_SEPARATOR": "$$'\n'"
JSON
복사
이유는 YAML 내 쌍따옴표 안에서 \는 이스케이핑 문자로 취급되기 때문에 \n이줄바꿈 특수문자로 그대로 취급되는 것이고, 쌍따옴표를 하지 않으면 문자열 그대로의 \n이 넘어가기 때문에 "\\n"이 된 것이다.
따라서 쌍따옴표를 하지 않으면 토픽 파싱에 문제가 생기니 주의해야 한다.

References

link iconOnline YAML Parser관련 문서