【发布时间】:2019-07-07 23:43:36
【问题描述】:
我正在使用 docker-compose 创建一个 redis 容器。但是,我需要它从一些默认键值开始。这可能吗?
【问题讨论】:
标签: docker redis docker-compose
我正在使用 docker-compose 创建一个 redis 容器。但是,我需要它从一些默认键值开始。这可能吗?
【问题讨论】:
标签: docker redis docker-compose
你需要修改你的 DockerCompose 文件,你也可以从一些包含键值的文件中添加,但这里是在 DockerCompose 文件中添加和获取键的最简单的例子。
version: '2'
services:
redis:
image: 'bitnami/redis:latest'
environment:
- ALLOW_EMPTY_PASSWORD=yes
ports:
- '6379:6379'
command:
- /bin/sh
- -c
- |
nohup redis-server &
sleep 5
echo "adding some default key value"
redis-cli SET docker awesome
echo "Get docker key value"
redis-cli GET docker
# this will keep container running
tail -f /dev/null
【讨论】:
有几种方法,但请注意,默认情况下,服务使用 Docker Compose 以任意顺序启动,即使您使用 depends_on,这也只会检查容器是否正在运行(例如 redis),而不是它们'已经完成了一些初始化过程。
查看使用持久存储运行redis 映像的选项:
https://hub.docker.com/_/redis/
使用这种方法,您可以将本地目录挂载到容器的/data 目录中或创建一个(数据)卷并使用它。然后,您可以通过对它运行 redis-cli 来预填充 redis 服务器。
这样做的一个技巧是对您计划的docker-compose.yml 文件,但docker-compose --file=/path/to/docker-compost.yaml up redis 其中redis 也是redis 服务的名称。您需要确保可以从主机 --ports: 6379:6379 访问 redis 服务,以便外部 redis-cli 可以访问它。
这种方法非常适合仅在本地使用,但不利于在其他地方部署解决方案。
Docker Compose - 据我所知 - 没有提供与 Kubernetes 的 init 容器等效的优雅,后者在依赖容器之前运行。
使用 Docker Compose,您可以包含一个初始化(运行一次)redis-cli 以填充服务器,但您必须在启动(成功)之前增加任何客户端以检查这是否已完成或是否存在此数据。
最简单的解决方案是让 redis 客户端失败,如果 redis 密钥不存在,则restart: always。
更高级的解决方案是为 redis 键的存在定义健康检查,然后定义 depends_upon: ... condition: service_healthy(参见 link)
另见 Docker Compose 中描述的启动顺序here
【讨论】: