23.03.04 20:47 작성
·
2K
·
수정됨
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");
강의 진도를 나갈 수가 없어서 답답합니다.
혹시 해결하신분들은 있으신가요..
답변 7
3
노드의 버전 때문일 확률이 높습니다.
제가 테스트 해본 결과
docker-compose up 명령은 yml파일에 "build ."과 같이 명시해주더라도,
매번 새롭게 이미지를 빌드하는 것이 아니라 이미 동일한 이름의 이미지가 있으면 업데이트를 하지 않고 그대로 이미지를 가져다 쓰는 것 같습니다.
그래서 저의 경우는 기존 도커 파일에
"RUN node:10" 부분을 "RUN node:18"로 수정 후
이미지 빌드를 따로 해준 뒤
"docker-compose up"을 실행하니 정상적으로 서버가 동작했습니다.
같은 상황이 아닐 수 있겠지만
한번 시도해보시는 것을 추천드립니다
교수님께서 수업 마지막에
docker-compose up --build를 통해
이미지를 재빌드 하면서 컴포즈를 실행시키는 모습을 보여주시는 것을 보았습니다.
노드 버전 수정 후, 이 방법을 사용해도 좋을 것 같습니다 ㅎㅎ
2
저는 아래 방법으로 해결하였습니다.
공식 문서에 따르면 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');
0
현재 작동되는 코드 입니다.
docker-compose.yml
version: '3'
services:
redis-server:
image: redis
container_name: redis-container
restart: unless-stopped
expose:
- 6379
node-app:
depends_on:
- redis-server
build:
context: .
dockerfile: Dockerfile
container_name: node-app
restart: on-failure
ports:
- "8787:8787"
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)
// 현재 숫자를 가져온 후 1씩 증가시킨다.
await client.set("number", parseInt(number) + 1);
await client.disconnect();
})
app.listen(8787);
console.log('server on!');
package.json
{
"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": "4.7.0"
},
"author": "",
"license": "ISC"
}
Dockerfile
FROM node
WORKDIR /usr/src/app
COPY ./ ./
RUN npm install
CMD [ "node", "server.js" ]
0
저는 노드 버전 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
2023. 05. 18. 23:07
답변 감사합니다!😍 해보고 또 답변 달겠습니다 ㅎㅎ