我有一个Docker镜像,它是一个node.js应用程序。该应用程序从本地运行的Redis中检索一些配置信息。因此,我正在尝试在运行Docker镜像时安装Redis。
是否可以通过扩展node.js App的Dockerfile来设置Redis?
如果解决方案不是通过Dockerfile,我怎么能实现这个?
截至目前,Dockerfile如下:
FROM节点:碳
WORKDIR / app
COPY package.json / app
运行npm install
COPY。 /应用
EXPOSE 3011
CMD节点/app/src/server.js
答案 0 :(得分:3)
最好的解决方案是使用docker compose。有了这个,你将创建一个redis容器,链接到它然后启动你的node.js应用程序。首先要安装详细的docker compose - (https://docs.docker.com/compose/install/)。
启动并运行后,您应该在与应用程序的dockerfile相同的文件夹中创建docker-compose.yml。它应包含以下内容
version: '3'
services:
myapp:
build: .
ports:
- "3011:3011"
links:
- redis:redis
redis:
image: "redis:alpine"
然后可以从您的node.js应用访问redis,但不是localhost:6379
,而是使用redis:6379
来访问redis实例。
要启动您的应用,您需要在终端中运行docker-compose up
。最佳做法是使用network
代替links
,但这是为了简单起见。
这也可以根据需要完成,同时在同一个图像上同时使用redis和node.js,以下Dockerfile应该可以工作,它基于问题中的内容:
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"
第二种方法实际上是不好的做法,为了简单起见,我同时使用了supervisor或类似的工具。 CMD中的睡眠是允许redis在应用程序实际启动之前启动,您应该将其调整为最适合您的应用程序。希望这会有所帮助,并且您使用第一种方法,因为这是更好的练习
答案 1 :(得分:2)
我的用例是在高山雄猫味中添加redis服务器:
这可行:
FROM tomcat:8.5.40-alpine
RUN apk add --no-cache redis
RUN apk add --no-cache screen
EXPOSE 6379
EXPOSE 3011
## Run Tomcat
CMD screen -d -m -S Redis /usr/bin/redis-server --bind '0.0.0.0' && \
${CATALINA_HOME}/bin/catalina.sh run
EXPOSE 8080
答案 2 :(得分:1)
如果您正在寻找带有nodejs和redis-server的最低限度的码头工人,那么可以这样做:
FROM nikolaik/python-nodejs:python3.5-nodejs8
RUN apt-get update
apt-get -y install redis-server
COPY . /app
WORKDIR /app
nohup redis-server &> redis.log &
然后您可以对节点应用程序执行进一步的步骤。