2017-12-28 66 views
0

도커 컨테이너에서 Cassandra 데이터베이스를 초기화하는 데 문제가 있습니다. 내가 docker build . -t cassandra을 할 때, 나는 cqlsh에서 오류가 발생도커 컨테이너에서 실행하면 cqlsh가 실패 함

FROM cassandra 
COPY ./createTable.cql /tmp/createTable.cql 
RUN cqlsh -f /tmp/createTable.cql 

:

Connection error: ('Unable to connect to any servers', {'127.0.0.1': error(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")}) 

하지만이 도커 컨테이너 외부에서 작업을 수행 할 때와 동일한 명령이 제대로 작동 여기 내 Dockerfile입니다. 연결이 거부되는 이유는 무엇입니까? 문제가 있다면 어떻게 데이터베이스를 초기화 할 수 있습니까?

도움이나 조언을 주셔서 감사합니다.

답변

1

RUN은 컨테이너를 실행할 때 실행되며 컨테이너를 실행할 때 실행되지 않습니다.

당신은 카산드라를 시작합니다 사용자 정의 스크립트를 작성해야합니다 (원래의 용기에서와 같은 - 카산드라의 Dockerfile 조사) 시작할 때까지 기다립니다, 오직 그 후 - cqlsh를 통해 명령을 실행합니다.

+0

Dockerfile은 공인 cassandra Dockerfile ('FROM cassandra') 행을 사용하기 때문에 컨테이너 내부에서 실행중인 Cassandra가 있습니다. Dockerfile에서 cqlsh 명령을 제거하고 실행 한 다음'docker exec -it cassandraContainer cqlsh'를 실행하면 작동합니다. –

+1

다른 것들을 혼합하고 있습니다. 컨테이너를 만들 때'RUN'이 실행됩니다. 이 시점에서이 컨테이너 내부에서 실행중인 카산드라가 없습니다 ... 당신이 설명하는대로, 카산드라는 컨테이너를 시작할 때 실행 중이지만, 이것은 컨테이너가 만들어진 후에 발생합니다. 내 대답의 두 번째 부분은 올바르게 구현하는 방법을 제안합니다 - 이것은 표준 패턴입니다 –

+0

좋아, 고마워. 나는 그것으로 커스텀 스크립트를 만들려고 노력할 것이다. 그러나 표준 패턴이 자신 만의 독창적 인 패턴을 만드는 것이라면 Dockerfile이 공식적인 이유는 무엇입니까? 그것은 단지 템플릿으로 사용하기위한 것입니까? –

1

cqlsh 명령은 호스트 이름이 제공되지 않으면 Cassandra가 실행중인 호스트 이름을 필요로하며 호스트 이름으로 localhost (127.0.0.1)를 사용합니다.

호스트 이름으로 localhost를 사용하고 있습니다. 외부에서 실행 중일 때 컨테이너 내부에서 실행될 때 잘 작동하는 이유 때문에 Cassandra가 컨테이너 외부에서 실행중인 것처럼 보입니다.

호스트 이름을 cqlsh에 전달하면 컨테이너 내에서 실행할 때 문제가 해결됩니다.

cqlsh <hostname or ip> -f /tmp/createTable.cql 
+0

그러나 Cassandra와 cqlsh는 모두 컨테이너에서 실행되므로 로컬 호스트입니다. 나는 네가 의미하는 것을 얻지 못한다. –