如何在Docker容器中启动带有Redis的Node.js应用程序?

3
我有一个简单但好奇的问题,我基于nodejs镜像创建了我的镜像,并在镜像上安装了redis,现在我想同时启动redis和nodejs应用程序,让它们都在容器中运行。然而,我只能让其中一个工作,node总是给我一个错误。有人有任何想法吗?
以下是需要翻译的内容:
  1. 如何在docker-compose up时启动nodejs应用程序?
  2. 如何在同一镜像/容器中后台运行redis?
我的Docker文件如下。
# Set the base image to node
FROM node:0.12.13

# Update the repository and install Redis Server
RUN apt-get update && apt-get install -y redis-server libssl-dev wget curl gcc

# Expose Redis port 6379
EXPOSE      6379
# Bundle app source
COPY ./redis.conf /etc/redis.conf

EXPOSE  8400

WORKDIR /root/chat/
CMD ["node","/root/www/helloworld.js"]
ENTRYPOINT  ["/usr/bin/redis-server"]

我从控制台日志中得到的错误信息是:

[36mchat_1 | [0m[1] 18 Apr 02:27:48.003 # 致命错误,无法打开配置文件“node”

Docker-yml 如下所示:

chat:
    build: ./.config/etc/chat/
    volumes:
        - ./chat:/root/chat
    expose:
        - 8400
    ports:
        - 6379:6379  
        - 8400:8400   
    environment:
        CODE_ENV: debug
        MYSQL_DATABASE: xyz
        MYSQL_USER: xyz
        MYSQL_PASSWORD: xyz        
    links:
        - mysql   
    #command: "true"  

你遇到了什么错误?请同时发布docker-compose.ym文件。 - lamirap
添加了一些额外信息 - mahen3d
1个回答

2
一个docker文件只能有一个入口点(CMD或ENTRYPOINT,不能同时存在)。但是,您可以使用像systemd这样的进程管理器在单个docker镜像中运行多个进程。互联网上有无数的方法来做到这一点。您可以使用此docker镜像作为基础:https://github.com/million12/docker-centos-supervisor。然而,我不明白为什么您不使用docker compose来启动一个单独的redis容器,就像您似乎想要用mysql做的那样。顺便问一下,在您发布的docker-compose文件中,mysql定义在哪里?以下是我用于在当前目录中构建node镜像并启动redis的compose文件示例:
web:
  build: .
  ports:
    - "3000:3000"
    - "8001:8001"
  environment:
    NODE_ENV: production
    REDIS_HOST: redis://db:6379
  links:
    - "db"
db:
  image: docker.io/redis:2.8

它应该可以与一个看起来像你的 Docker 文件一样的文件一起工作,但不要尝试启动 Redis。


我尝试在另一个redis容器上运行并链接它,但是代码编写得非常糟糕,以至于我必须更改创建redis服务器的任何地方,这就是为什么我想将它们都添加到一个容器中的原因。 - mahen3d
然后你需要使用类似systemd的东西。 - Robert Moskal
我已经在Centos上设置了这个服务,但是我不太擅长Ubuntu,如何设置一个服务?(我认为您指的是systemd)?您能否提供一个示例?针对此答案的docker文件。 - mahen3d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接