개발을 하다 보면 앱에서 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를 이용하는게 불편할때가 있어서 필요할때가 있어서 메모한다.