【问题标题】:ERROR: Service 'redis' failed to build. When building redis image by docker-compose错误:服务“redis”未能构建。通过 docker-compose 构建 redis 镜像时
【发布时间】:2017-10-24 22:14:03
【问题描述】:

我正在对接一个基于 nodejs、redis 和 mysql 的应用程序。我已经安装了 redis 服务器并且它运行良好,但是我可以使用 docker-compose.yml 对所有三个进行 dockerize

$ docker-compose up --build
Building redis
Step 1/11 : FROM node:alpine
 ---> e079048502ec
Step 2/11 : FROM redis:alpine
 ---> da2b86c1900b
Step 3/11 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 28b2f837b54c
Step 4/11 : WORKDIR /usr/src/app
 ---> Using cache
 ---> d1147321eec4
Step 5/11 : RUN apt-get install redis-server
 ---> Running in 2dccd5689663
/bin/sh: apt-get: not found
ERROR: Service 'redis' failed to build: The command '/bin/sh -c apt-get install redis-server' returned a non-zero code: 127

这是我的 dockerfile。

Dockerfile:

FROM node:alpine
FROM redis:alpine

# Create app directory
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app

# Install app dependencies

    ## Install Redis ##
        RUN apt-get install redis-server
    ## Install nodejs on ubuntu ##
        RUN sudo apt-get update && wget http://nodejs.org/dist/v0.6.9/node-v0.6.9.tar.gz \ 
        && tar -xvzf node-v0.6.9.tar.gz \
        && cd node-v0.6.9 \
        && ./configure && make && sudo make install \
        && mkdir myapp && cd myapp \
        && npm init \
        && npm install express --save \
        && npm install express \
        && npm install --save path serve-favicon morgan cookie-parser body-parser \
        && npm install --save express jade \
        && npm install --save debug \

    COPY package.json /usr/src/app/
    COPY redis.conf /usr/local/etc/redis/redis.conf
    RUN npm install

# Bundle app source
    COPY . /usr/src/app

EXPOSE 3000

CMD [ "redis-server", "/usr/local/etc/redis/redis.conf", "npm", "start" ]

这是 docker-compose.yml 文件

docker-compose.yml

version: '2'

services:
  db:
    build: ./docker/mysql
    # image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
      #- ./mysql:/docker-entrypoint-initdb.d
    # restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      # MYSQL_DATABASE: cg_apiserver
      # MYSQL_USER: root
      # MYSQL_PASSWORD: root

  redis:
    build: ./docker/redis
    image: "redis:alpine"

  node:
    build: ./docker/node
    ports:
      - '3000:80'
    restart: always
    volumes:
       - .:/usr/src/app
    depends_on:
      - db
      - redis
    command: npm start

volumes:
    db_data:

【问题讨论】:

    标签: docker redis docker-compose


    【解决方案1】:

    您似乎尝试将两个 Dockerfile 合并为一个

    首先,您的多个FROM 在这里没有意义。基本概念是基于FROM 仅一个基本图像。见this

    其次,您的 docker-compose 看起来不错,但是看到 Dockerfile,它表明您正在尝试在同一个映像中构建两个应用程序(redis 和节点应用程序)。

    所以从 ./docker/node/Dockerfile 中取出 redis 的东西:

    FROM node:alpine
    
    # Create app directory
        RUN mkdir -p /usr/src/app
        WORKDIR /usr/src/app
    
    # Install app dependencies
        ## Install nodejs on ubuntu ##
            RUN wget http://nodejs.org/dist/v0.6.9/node-v0.6.9.tar.gz \ 
            && tar -xvzf node-v0.6.9.tar.gz \
            && cd node-v0.6.9 \
            && ./configure && make && sudo make install \
            && mkdir myapp && cd myapp \
            && npm init \
            && npm install express --save \
            && npm install express \
            && npm install --save path serve-favicon morgan cookie-parser body-parser \
            && npm install --save express jade \
            && npm install --save debug \
    
        COPY package.json /usr/src/app/
        RUN npm install
    
    # Bundle app source
        COPY . /usr/src/app
    
    EXPOSE 3000
    
    CMD ["npm", "start" ]
    

    使用这个 ./docker/redis/Dockerfile:

    FROM redis:alpine
    COPY redis.conf /usr/local/etc/redis/redis.conf
    # No need to set a custom CMD
    

    而且,我建议从 redis (docker-compose.yml) 中删除“image:”行。没必要:

     redis:
        build: ./docker/redis
        image: "redis:alpine"        <----
    

    编辑。此外,您不再需要apt-get update。我已经删除了这个sudo apt-get update &amp;&amp;

    【讨论】:

    • 根据您的代码调整两个文件后,它会抛出此错误:错误:服务'redis'未能构建:lstat redis.conf:没有这样的文件或目录
    • 需要调redis吗?如果没有,请删除 Dockerfile 中的 .conf 行。如果是,请告诉我你的文件在哪里。
    • 如果您使用 alpine,请将 apt-get install 替换为 apk add --update
    • @user2915097 错误:无法满足的约束:redis-server(缺失):要求:world[redis-server]
    【解决方案2】:

    在进行了以下更改后,它现在可以工作了:

    1. 在根 docker 中创建文件夹

    2. 在docker里面创建文件夹redis

    3. 创建具有以下内容的 Dockerfile:

    docker >> redis >> Dockerfile

    FROM smebberson/alpine-base:1.0.0
    
    '#MAINTAINER Scott Mebberson <scott@scottmebberson.com>
    
    VOLUME ["/data"]
    
    '#Expose the ports for redis
    
    EXPOSE 6379
    

    docker-compose.yml 文件没有变化。

    运行以下命令并查看输出

    1. 运行此命令构建容器
    sudo docker-compose up --build -d
    
    1. 运行此命令检查正在运行的容器
    sudo docker ps
    
    1. 运行此命令检查网络并获取 IP
    sudo docker inspect redis_container_name 
    
    sudo docker inspect node_container_name  
    

    【讨论】:

      【解决方案3】:

      我已经在我的项目中轻松解决了这个问题(COPY 不起作用):只需在 YML 文件(版本 3)中添加“context” - Dockerfile 目录的路径,例如:

      build:
      context: Starkman.Backend.Storage/Redis
      dockerfile: Dockerfile
      

      "Starkman.Backend.Storage/Redis" - 到目录的路径。并且命令“COPY”的未知临时目录将在您的“上下文”中。

      这是我的 Dockerfile:

      FROM redis
      COPY redis.conf /usr/local/etc/redis/redis.conf
      EXPOSE 6379
      CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 2020-06-02
        • 2021-09-04
        相关资源
        最近更新 更多