我正在使用docker-compose创建一个redis容器。但是,我需要它以一些默认键值开始。这可能吗?
答案 0 :(得分:2)
有几种方法,但是请注意,默认情况下,服务会使用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服务的名称。您可能需要确保可以从主机redis
访问--ports: 6379:6379
服务,以便外部redis-cli
可以访问它。
此方法仅在本地使用时效果很好,但不利于将解决方案部署到其他地方。
据我所知,Docker Compose不能很好地等同于Kubernetes的init容器,该容器在 依赖容器之前运行。
使用Docker Compose,您可以包括一个初始化(运行一次)redis-cli
来填充服务器,但是您必须在启动之前(成功地)扩充任何客户端以检查是否已完成或是否存在此数据。
最简单的解决方案是让redis客户端失败,如果没有redis密钥,则restart: always
失败。
更高级的解决方案是为redis密钥的存在定义一个运行状况检查,然后depends_upon: ... condition: service_healthy
(请参阅link)
另请参见here
中所述的Docker Compose中的启动顺序答案 1 :(得分:0)
您需要修改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