La soluzione migliore sarebbe usare la composizione mobile. Con questo creeresti un contenitore redis, colleghi ad esso e poi avvierai la tua app node.js. La prima cosa sarebbe installare Docker Compose dettagliato qui - (https://docs.docker.com/compose/install/).
Una volta che lo hai installato e funzionante, dovresti creare un docker-compose.yml nella stessa cartella del dockerfile della tua app. Dovrebbe contenere quanto segue
version: '3'
services:
myapp:
build: .
ports:
- "3011:3011"
links:
- redis:redis
redis:
image: "redis:alpine"
Quindi redis sarà accessibile dalla tua app node.js ma invece di localhost:6379
useresti redis:6379
per accedere all'istanza redis.
Per avviare la tua app devi eseguire docker-compose up
, nel tuo terminale. La migliore pratica sarebbe quella di utilizzare una network
invece di links
ma questo è stato fatto per semplicità.
Questo può anche essere fatto come desiderato, avendo sia redis che node.js sulla stessa immagine, il seguente Dockerfile dovrebbe funzionare, è basato su ciò che è nella domanda:
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"
Questo secondo metodo è davvero una cattiva pratica e l'ho usato contemporaneamente al posto del supervisore o di uno strumento simile per semplicità. La sospensione nel CMD serve a consentire l'avvio di redis prima che l'app venga effettivamente avviata, dovresti adattarla a ciò che ti si addice meglio. Spero che questo ti aiuti e che tu usi il primo metodo in quanto è una pratica molto migliore