티스토리 뷰
gRPC 서버 Docker 이미지 빌드
FROM rust:latest as builder
WORKDIR /app
COPY . .
RUN apt update && apt install -y protobuf-compiler
RUN cargo build --release --bin server
FROM debian:stable-slim
RUN apt update \
&& apt install -y libssl-dev ca-certificates \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/server /app/server
CMD ["/app/server"]
- multistage build를 통해 1GB가 넘는 rust base 이미지 -> 100MB가량으로 용량 절감
docker compose로 실행중인 gRPC 서버와 연결이 안 되는 문제
발견한 오류
thread 'main' panicked at src/bin/client.rs:19:48:
called `Result::unwrap()` on an `Err` value: Status { code: Unknown, message: "transport error", source: Some(tonic::transport::Error(Transport, hyper::Error(Io, Custom { kind: BrokenPipe, error: "stream closed because of a broken pipe" }))) }
원인
use greeting::{greet::greet_service_server::GreetServiceServer, server::GreetingServer};
use tonic::transport::Server;
extern crate greeting;
#[tokio::main]
async fn main() {
let addr = "127.0.0.1:50051".to_string();
println!("Server listening on {}", addr);
let greeting_server = GreetServiceServer::new(GreetingServer::default());
Server::builder()
.add_service(greeting_server)
.serve(addr.parse().unwrap())
.await
.unwrap()
}
- Docker 컨테이너 안에서는 어떤 ip 주소와 바인딩을 해서 서버를 실행해도 상관이 없지만(아마도), 외부로 포트를 포워딩하여 외부의 요청을 받아서 처리하려면 0.0.0.0 주소를 반드시 사용해야 함
- 따라서 위의 오류는 0.0.0.0 주소가 아닌 127.0.0.1 주소를 사용함으로 인해 컨테이너에서 외부의 요청을 서버로 전달할 수 없어서 발생한 것
- go로 컨테이너에서 서버를 실행할 때는 포트 번호만 넘겨주고 실행해도 아무 문제가 없었기 때문에 놓치고 넘어갔던 부분이라고 생각
해결
let addr = "0.0.0.0:50051".to_string();
주소 변경하고 이미지 새로 빌드 및 컨테이너 실행
로컬에서 컨테이너에서 실행중인 서버로 요청 및 응답이 정상 전달 및 처리됨
참고
'Rust > 코딩 하기' 카테고리의 다른 글
[Rust] stylus를 사용해 Rust로 Arbitrum stylus testnet에 스마트 컨트랙트 배포하기 (0) | 2023.12.28 |
---|---|
[Rust] tonic-build를 사용해 ProtoBuf 파일 컴파일하기 (0) | 2023.12.26 |