文档章节

docker-compose 基于Dockerfile 安装并启动redis容器的血案

o
 osc_g8254g7s
发布于 2019/08/19 19:28
字数 599
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

前言

为了实现“一键部署”的目的,我采用Dockerfile 和 docker-compose来实现自己的目的。这个过程中,我怎么也无法启动自己的redis-server服务。

目录结构

 👍  ~/Workspace/docker/images/redis  tree
.
├── Dockerfile
├── conf
│   └── redis.conf
└── docker-compose.yml

文件内容

Dockerfile
FROM redis:latest
WORKDIR /data/
# 默认的源太慢,原因就是被我大天朝给墙了,所以换成国内,阿里的
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list

RUN apt-get clean

# 不能直接 apt-get install curl ,因为容器里面默认apt的包是空的,所以需要更新到本地
RUN apt-get update 

# docker 是基于Ubuntu的,所以里面基本默认都带有apt-get这个工具
RUN apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir -p  /usr/local/etc/redis/ \ 
    && curl http://download.redis.io/redis-stable/redis.conf > /usr/local/etc/redis/redis.conf

CMD [ "redis-server","/usr/local/etc/redis/redis.conf"]
docker-compose.yml
version: "2.2"

services:
  redis:
    # 使用当前目录下的Dockerfile构建镜像
    build: .
    image: my_redis
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data
      # 此处就是引发血案的地方
      # - ./conf:/usr/local/etc/redis

问题分析:

  1. Dockerfile 在构建的过程中,通过curl获取到了redis.conf的配置

  2. docker-compose 在启动容器时,由于 volumes这个地方将本地的目录挂在到了redis容器内部的/usr/local/etc/redis下。那么/usr/local/etc/redis里面的文件就会被全部被本地覆盖。如果本地./conf这个目录下是空的,则/usr/local/etc/redis里面也会是空的。

  3. 解决办法

    1. 本地的./conf文件夹中存在redis.conf,这样的文件
    2. 像上面的案例一样,不要将redis.conf暴露处理。

调试问题的经过

本次调试,着实让我头疼了老一阵,一看死,总是报 can't open file 这种错误。我查看了docker 日志,依然无法找到问题。想进入到docker 容器里面去看,结果发现redis容器根本就没有起来。将Dockerfile 改成如下的形式,才启动了redis容器,并顺利进入到容器里面。才找到原来是redis.conf文件被覆盖掉了。

FROM redis:latest
WORKDIR /data/
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean
RUN apt-get update 
RUN apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir -p  /usr/local/etc/redis/ \ 
    && curl http://download.redis.io/redis-stable/redis.conf > /usr/local/etc/redis/redis.conf
# CMD [ "redis-server","/usr/local/etc/redis/redis.conf"]

# 启动容器,直接让其运行 shell脚本,这样容器就不会推出了。
CMD ["sh","-c","while true;do sleep 1000 ;done"]
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

PO模式你会吗?自动化测试PO模式分层如何实现?

一、什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BasePage:封装一些最基础的s...

osc_s4e6jr85
10分钟前
0
0
lodash compact & concat

前置 本篇随笔包含 _.compact 和 _.concat 及其依赖的工具函数。 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节。 compact _.compact(array) 创建一个新数组,包含原数组中...

osc_xu7n68ts
10分钟前
3
0
Django快速开发实践:Drf框架和xadmin配置指北

步骤 既然是快速开发,那废话不多说,直接说步骤: 安装Djagno 安装Django Rest Framework 定义models 定义Rest framework的serializers 定义Rest framework的viewsets 配置Rest framework的...

osc_qo2uprmb
11分钟前
7
0
SQL注入原理及代码分析(一)

前言 我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了。而且知识点比较多,所以在这里总结一下。通过构造有缺陷的代码...

osc_axrkis5i
13分钟前
6
0
Tomcat启动流程简析

Tomcat是一款我们平时开发过程中最常用到的Servlet容器。本系列博客会记录Tomcat的整体架构、主要组件、IO线程模型、请求在Tomcat内部的流转过程以及一些Tomcat调优的相关知识。 力求达到以下...

osc_5c67s863
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部