docker 官方的 redis 镜像如何指定配置文件。

fiftyk
  • 40

参考 docker store 里 redis 镜像的使用 帮助

Alternatively, you can specify something along the same lines with docker run options.
$ docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf
Where /myredis/conf/ is a local directory containing your redis.conf file. Using this method means that there is no need for you to have a Dockerfile for your redis container.

首先我创建了一个目录 /docker/redis/ 并在其中放置配置文件: redis.conf

接下来,我使用下面的代码启动镜像:

> docker run -v /docker/redis:/data --name my-redis -d redis redis-server /data/redis.conf

再用 docker inspect [containerId] 查看刚刚创建的容器发现容器启动后立即就退出了:

"State": {
    "Status": "exited",
    "Running": false,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 0,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2017-02-07T03:15:46.558191922Z",
    "FinishedAt": "2017-02-07T03:15:46.973984747Z"
},
...        

另外,我尝试不指定配置文件,只挂着 /data 目录,是没有问题,可以顺利启动:

> docker run -v /docker/redis:/data  -d redis

好像找到原因了。我将 redis.conf 中的 daemonize yes 注释掉即可运行!但这是什么原因?

docker-entrypoint.sh

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
    set -- redis-server "$@"
fi

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
    chown -R redis .
    exec gosu redis "$0" "$@"
fi

exec "$@"

上面是官方 redis 镜像的 entrypoint 脚本,shell 脚本不了解,查了一下第一行 set -e 的意思是:"若指令传回值不等于 0 ,则立即退出 shell",和这个有关吗?又或者和 docker run-d 参数有关系?"Run container in background and print container ID"

回复
阅读 27.1k
4 个回答

我的是这么启动的

docker run -d -ti \
-p 7481:6379 \
-v /project/pos/conf/redis.conf:/etc/redis/redis.conf \
-v /project/pos/data:/data \
--restart always \
--name pos_redis \
daocloud.io/redis \
redis-server /etc/redis/redis.conf

解释一下原因

When you demonize the Redis process, the final Docker exec process (the one that started Redis) has nothing left to do, so that process exits, and the container ends itself.

If you want to keep the container up, you can either not demonize it, or you can, but you must do something else like call wait, or more preferably, tail -f the redis logs

Redis 进程被幽灵化(后台化)后, 启动Redis的那个进程, 也就是Docker执行进程无事可做, 因此Docker执行进程退出, 容器?. 后面几句话说的用tail -f 去输出redis的日志. 避免Docker执行进程退出.

参考资料

https://stackoverflow.com/que...

容器中的应用都应该以前台执行,不能在后台运行

对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主
进程退出,容器就失去了存在的意义,从而退出

此去經年
  • 4
新手上路,请多包涵

感谢,去掉以后就可以启动了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏