La mejor solución sería usar docker compose. Con esto, crearía un contenedor redis, vincularlo y luego iniciar su aplicación node.js. Lo primero sería instalar docker compose detallado aquí - (https://docs.docker.com/compose/install/).
Una vez que lo tenga en funcionamiento, debe crear un docker-compose.yml en la misma carpeta que el dockerfile de su aplicación. Debe contener lo siguiente
version: '3'
services:
myapp:
build: .
ports:
- "3011:3011"
links:
- redis:redis
redis:
image: "redis:alpine"
Luego se podrá acceder a redis desde su aplicación node.js, pero en lugar de localhost:6379
usarías redis:6379
para acceder a la instancia de redis.
Para iniciar su aplicación, debe ejecutar docker-compose up
, en tu terminal. La mejor práctica sería usar una network
en lugar de links
pero esto fue hecho por simplicidad.
Esto también se puede hacer como se desee, con redis y node.js en la misma imagen, el siguiente Dockerfile debería funcionar, se basa en lo que está en la pregunta:
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 es realmente una mala práctica y lo he usado simultáneamente en lugar de supervisor o una herramienta similar por simplicidad. El sueño en el CMD es permitir que redis se inicie antes de que se inicie la aplicación, debe ajustarlo a lo que más le convenga. Espero que esto ayude y que utilices el primer método, ya que es una práctica mucho mejor