docker-compose 基于Dockerfile 安装并启动redis容器的血案
2024-09-05 14:58:16
前言
为了实现“一键部署”的目的,我采用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
问题分析:
Dockerfile 在构建的过程中,通过curl获取到了redis.conf的配置
docker-compose 在启动容器时,由于
volumes
这个地方将本地的目录挂在到了redis容器内部的/usr/local/etc/redis
下。那么/usr/local/etc/redis
里面的文件就会被全部被本地覆盖。如果本地./conf
这个目录下是空的,则/usr/local/etc/redis
里面也会是空的。解决办法
- 本地的
./conf
文件夹中存在redis.conf
,这样的文件 - 像上面的案例一样,不要将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"]
最新文章
- OS初识
- LINUX 配置IP
- The Triangle
- jquery 仿百度搜索下拉框的插件
- PHP面向对象(OOP)编程入门教程————如何实例化对象?
- JSON 语法规则详解
- Android利用V4包中的SwipeRefreshLayout实现上拉加载
- UPDATE语句中使用JOIN
- phpmyadmin 设置用户登录
- hadoop之eclipse环境的配置
- 【C语言】03-printf和scanf函数
- (转载)mysql书籍
- 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析
- 使用Springboot + Gradle快速整合Mybatis-Plus
- MT【327】两道不等式题
- Java 集合系列(三)—— LinkedList
- Autoware(2)—加载地图数据
- k8s基于CA签名的双向数字证书认证(三)
- Matlab如何循环读取文件
- JdbcTemplate 方法使用
热门文章
- Html的总结(待完善)
- koa2框架介绍
- Python GUI wxPython StaticText控件背景色透明
- leetcode之820. 单词的压缩编码 | python极简实现字典树
- Netty中ChannelHandler的生命周期
- [模拟]Educational Codeforces Round 2A Extract Numbers
- 给社团同学做的R语言爬虫分享
- 使用Python创建自己的Instagram滤镜
- 面试刷题27:程序员如何防护java界的新冠肺炎?
- SpringCloud服务的注册发现--------zookeeper实现服务与发现 + Ribbon实现客户端负载均衡