Last update:
개요
카프카 도커 이미지 중 bitnami/kafka, wurstmeister/kafka, confluentinc/kafka 등이 많이 쓰이는데, 문서화가 잘 돼있고 사용자가 많은 wurstmeister/kafka를 써보기로 했다.
environment:
KAFKA_CREATE_TOPICS: "Topic1:1:3,Topic2:1:1:compact"
YAML
복사
토픽을 생성하기 위한 값인데, 각 토픽을 쉼표(,)를 기준으로 구분하기 때문에 토픽이 많아지면 라인이 지나치게 길어지는 문제가 있다. 구분자를 쉼표가 아니라 다른 문자로 바꾸려면 KAFKA_CREATE_TOPICS_SEPARATOR 변수를 설정해줘야 한다. 예를 들어 "$$'\n'"으로 바꿀 경우 줄바꿈을 기준으로 토픽이 생성된다고 한다.
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
$'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
Online YAML Parser관련 문서