• 카테고리

    질문 & 답변
  • 세부 분야

    데브옵스 · 인프라

  • 해결 여부

    미해결

docker-compose up 시 오류

23.03.04 20:47 작성 23.03.04 23:37 수정 조회수 1.37k

0

다른 질문도 참고해보았지만 도저히 해결이 안되네요

 

아래는 오류 로그입니다.

ui-MacBookAir docker-compose-app % docker-compose up
[+] Running 2/0
 ⠿ Container docker-compose-app-node-app-1      Created                                                                                                  0.0s
 ⠿ Container docker-compose-app-redis-server-1  Recreated                                                                                                0.0s
Attaching to docker-compose-app-node-app-1, docker-compose-app-redis-server-1
docker-compose-app-redis-server-1  | 1:C 04 Mar 2023 11:43:49.189 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
docker-compose-app-redis-server-1  | 1:C 04 Mar 2023 11:43:49.189 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
docker-compose-app-redis-server-1  | 1:C 04 Mar 2023 11:43:49.189 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.189 * monotonic clock: POSIX clock_gettime
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.190 * Running mode=standalone, port=6379.
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.190 # Server initialized
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.192 * Ready to accept connections
docker-compose-app-node-app-1      | server is running
docker-compose-app-node-app-1      | events.js:174
docker-compose-app-node-app-1      |       throw er; // Unhandled 'error' event
docker-compose-app-node-app-1      |       ^
docker-compose-app-node-app-1      | 
docker-compose-app-node-app-1      | Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
docker-compose-app-node-app-1      |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
docker-compose-app-node-app-1      | Emitted 'error' event at:
docker-compose-app-node-app-1      |     at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:341:14)
docker-compose-app-node-app-1      |     at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:222:14)
docker-compose-app-node-app-1      |     at Socket.emit (events.js:198:13)
docker-compose-app-node-app-1      |     at emitErrorNT (internal/streams/destroy.js:91:8)
docker-compose-app-node-app-1      |     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
docker-compose-app-node-app-1      |     at process._tickCallback (internal/process/next_tick.js:63:19)
docker-compose-app-node-app-1 exited with code 1
^CGracefully stopping... (press Ctrl+C again to f

 

나머지는 소스 파일입니다.

version: "3"
services:
  redis-server:
    image: "redis"
  node-app:
    build: .
    ports:
      - "8080:8080"
FROM node

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]
{
  "name": "docker-compose-app",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express": "4.17.1",
    "redis": "3.0.2"
  },
  "author": "",
  "license": "ISC"
}
const express = require("express");
const redis = require("redis");

// 레디스 클라이언트 생성
const client = redis.createClient({
    socket: {
        host: "redis-server",
        port: 6379
    }
});

const app = express();

app.get("/", async (req, res) => {
    await client.connect();
    let number = await client.get("number");

    if(number === null){
        number = 0;
    }

    console.log(`Number : ${number}`);
    res.send(`숫자가 1씩 올라갑니다. 숫자 : ${number}`);
    await client.set("number", parseInt(number) + 1);
    await client.disconnect();
});

app.listen(8080);
console.log("server is running");

강의 진도를 나갈 수가 없어서 답답합니다.

혹시 해결하신분들은 있으신가요..



 

답변 6

·

답변을 작성해보세요.

2

ssongkr님의 프로필

ssongkr

2023.08.28

저는 아래 방법으로 해결하였습니다.

공식 문서에 따르면 Redis 3 버전은 Promise를 지원하지 않는다고 하네요. 따라서 util 라이브러리를 이용하여 문제를 해결해야합니다. (dependencies util 추가)

Node Redis currently doesn't natively support promises (this is coming in v4), however you can wrap the methods you want to use with promises using the built-in Node.js util.promisify method on Node.js >= v8;

const { promisify } = require("util");
const getAsync = promisify(client.get).bind(client);

getAsync.then(console.log).catch(console.error);

 

const express = require("express");
const redis = require("redis");
const { promisify } = require("util");

//레디스 클라이언트 생성 
const client = redis.createClient({
  host: "redis-server",
  port: 6379
});
const getAsync = promisify(client.get).bind(client);
const setAsync = promisify(client.set).bind(client);

client.on('error',err => console.log('Redis Client Error',err));

const app = express();

app.get('/',async (req,res) => {
  let number = await getAsync('number');
  if (number === null) {
    number = 0;
  }
  res.send("숫자가 1씩 올라갑니다. 숫자: " + (parseInt(number)));
  await setAsync('number', (parseInt(number) + 1))
})

app.listen(8080);
console.log('Server is running');

cold님의 프로필

cold

2024.01.21

감사합니다^^

2

jeensh25님의 프로필

jeensh25

2023.05.18

노드의 버전 때문일 확률이 높습니다.

제가 테스트 해본 결과
docker-compose up 명령은 yml파일에 "build ."과 같이 명시해주더라도,
매번 새롭게 이미지를 빌드하는 것이 아니라 이미 동일한 이름의 이미지가 있으면 업데이트를 하지 않고 그대로 이미지를 가져다 쓰는 것 같습니다.

그래서 저의 경우는 기존 도커 파일에
"RUN node:10" 부분을 "RUN node:18"로 수정 후
이미지 빌드를 따로 해준 뒤
"docker-compose up"을 실행하니 정상적으로 서버가 동작했습니다.

같은 상황이 아닐 수 있겠지만
한번 시도해보시는 것을 추천드립니다

교수님께서 수업 마지막에
docker-compose up --build를 통해
이미지를 재빌드 하면서 컴포즈를 실행시키는 모습을 보여주시는 것을 보았습니다.
노드 버전 수정 후, 이 방법을 사용해도 좋을 것 같습니다 ㅎㅎ

답변 감사합니다!😍 해보고 또 답변 달겠습니다 ㅎㅎ

이상수님의 프로필

이상수

2024.01.30

감사함니다ㅠㅠ 기존에 있던 컨테이너, 이미지 다 지우고 docker-compose up 하니까 되네요ㅠㅠㅠ

0

김기쁨님의 프로필

김기쁨

2024.02.02

저는 노드 버전 16으로 바꿔서 빌드하고 실행하니 돌아가긴 합니다... (OS는 윈도우 입니다!)

혹시 도움이 되실까 해서 코드 남깁니다.

 

server.js

  • 이전 강의 강사님께서 남기신 코드 복붙

const express = require("express");

const redis = require("redis");


//레디스 클라이언트 생성 

const client = redis.createClient({

socket: {

host: "redis-server",

port: 6379

}

});


const app = express();

app.get('/', async (req, res) => {

await client.connect();

let number = await client.get('number');

if (number === null) {

number = 0;

}

console.log('Number: ' + number);

res.send("숫자가 1씩 올라갑니다. 숫자: " + number)

await client.set("number", parseInt(number) + 1)

await client.disconnect();;;

})

app.listen(8080);

console.log('Server is running');

 

package.json

  • 여기서 nodemon 모듈은 필요 없습니다.

{
  "name": "nodejs-app-example",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express": "4.18.2",
    "nodemon": "^3.0.3",
    "redis": "4.6.12"
  },
  "author": "",
  "license": "ISC"
}

 

Dockerfile

  • 노드 버전 16으로 정한 이유는 딱히 없습니다.

# 베이스 이미지 -> node version 16
FROM node:16

# 워킹 디렉토리 설정
WORKDIR /usr/src/app

COPY package.json ./

# 종속성 설치
RUN npm install

COPY ./ ./

# node 서버를 실행시키는 명령어
CMD ["node", "server.js"]

 

docker-compose.yml

  • 강사님과 다르게 이미 빌드된 도커 이미지 yml 파일에 명시해주었습니다.

    (위 도커 파일 사용해서 빌드)

version: '3'

services:
  redis-server:
    image: 'redis'
  node-app:
    image: 'joykim93/docker-compose-node-demo'
    ports:
      - '8080:8080'

0

patagonia님의 프로필

patagonia

2023.08.03

    await client.connect;

client.connect() -> client.connect 로 변경해서 해보세요.

0

seonjun Moon님의 프로필

seonjun Moon

2023.06.10

나도 포기;;;

싸다고 들엇는데 생각보다 다뤄지지 않은 오류가 너무 많네요.

끽해봐야 OS 몇개 안되는것도 그렇고

3년이면 노드 버전이 몇인데 아직도 이거 리뉴얼을 안하다니 좀 너무하다는 생각도 듭니다.

0

KIP님의 프로필

KIP

2023.03.19

해결하셨나요?

안녕하세요. 해결하지 못한 채로, 그냥 다음 섹션으로 넘어가서 강의 듣고 있습니다 ㅎㅎ ㅠ