A melhor solução seria usar o docker compose. Com isso, você criaria um contêiner redis, vincularia a ele e iniciaria seu aplicativo node.js. A primeira coisa seria instalar o docker compose detalhado aqui - (https://docs.docker.com/compose/install/).
Depois de colocá-lo em execução, você deve criar um docker-compose.yml na mesma pasta do arquivo docker do seu aplicativo. Deve conter o seguinte
version: '3'
services:
myapp:
build: .
ports:
- "3011:3011"
links:
- redis:redis
redis:
image: "redis:alpine"
Em seguida, o redis estará acessível a partir do seu aplicativo node.js, mas em vez de
localhost:6379
você usaria redis:6379
para acessar a instância do redis. Para iniciar seu aplicativo, você deve executar
docker-compose up
, em seu terminal. A melhor prática seria usar uma network
em vez de links
mas isso foi feito para simplificar. Isso também pode ser feito conforme desejado, tendo redis e node.js na mesma imagem, o seguinte Dockerfile deve funcionar, é baseado no que está na pergunta:
FROM node:carbon
RUN wget http://download.redis.io/redis-stable.tar.gz && \
tar xvzf redis-stable.tar.gz && \
cd redis-stable && \
make && \
mv src/redis-server /usr/bin/ && \
cd .. && \
rm -r redis-stable && \
npm install -g concurrently
EXPOSE 6379
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 3011
EXPOSE 6379
CMD concurrently "/usr/bin/redis-server --bind '0.0.0.0'" "sleep 5s; node /app/src/server.js"
Este segundo método é uma prática muito ruim e eu usei simultaneamente em vez de supervisor ou ferramenta semelhante para simplificar. A suspensão no CMD é para permitir que o redis inicie antes que o aplicativo seja realmente iniciado, você deve ajustá-lo para o que melhor lhe convier. Espero que isso ajude e que você use o primeiro método, pois é uma prática muito melhor