docker 에서 컨테이너 명으로 ip 구하기 (cli & node)

개배박발불지은만자·2024년 1월 14일

개발을 하다 보면 앱에서 docker 의 서비스 명(컨테이너명)을 ip 로 사용해야 할때가 있다.

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis

이렇게 cli 에서는 구해서 쓸수 있는데
문제는 node 에서 변수로 넣어야 할때가 발생해서 메모해 둔다.

/**
 * Docker 환경에서 컨테이너 이름으로 ip 를 가져 오는 함수
 * @param containerNameOrId 
 * @returns 
 */
function getContainerIp(containerNameOrId: string) {
  return new Promise((resolve, reject) => {
    exec(`docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ${containerNameOrId}`, (err, stdout, stderr) => {
      console.log('stdout:', stdout); // 추가된 로그
      console.log('stderr:', stderr); // 추가된 로그
      if (err) {
        reject(err);
        return;
      }
      const ipAddress = stdout.trim();
      resolve(ipAddress);
    });
  });
}

let redisUrl: string
// 개발 환경에서만 실행 여부 확인
if (process.env.NODE_ENV === 'development') {
  // 개발 환경에서만 실행
  getContainerIp("redis")
    .then((ip) => {
      console.log(`\n redip:${ip}`)
      redisUrl = `redis://${ip}:${process.env.REDIS_PORT}`
    })
} else {
  redisUrl = `redis://redis:${process.env.REDIS_PORT}`
}
export { redisUrl }

그냥 docker의 dns 를 믿어야 하겠지만
개발 환경에서는 docker의 dns를 이용하는게 불편할때가 있어서 필요할때가 있어서 메모한다.

수정본

0개의 댓글