Docker-compose , anyway to specify a redis.conf file?

ⅰ亾dé卋堺 提交于 2020-06-24 10:59:49

问题


my redis container is defined as he standard image in my docker_compose.yml

redis:  
  image: redis
  ports:
    - "6379"

I guess it's using standard settings like binding to Redis at localhost I need to bind it to 0.0.0.0, is there anyway to add a local redis.conf file to change the binding and let docker-compose knows it?

thanks for any trick...


回答1:


Yes. Just mount your redis.conf over the default with a volume:

redis:  
  image: redis
  volumes:
    - ./redis.conf:/usr/local/etc/redis/redis.conf
  ports:
    - "6379"

Alternatively, create a new image based on the redis image with your conf file copied in. Full instructions are at: https://registry.hub.docker.com/_/redis/

However, the redis image does bind to 0.0.0.0 by default. To access it from the host, you need to use the port that Docker has mapped to the host for you which you find by using docker ps or the docker port command, you can then access it at localhost:32678 where 32678 is the mapped port. Alternatively, you can specify a specific port to map to in the docker-compose.yml.

As you seem to be new to Docker, this might all make a bit more sense if you start by using raw Docker commands rather than starting with Compose.




回答2:


Old question, but if someone still want to do that, it is possible with volumes and command:

command: redis-server /usr/local/etc/redis/redis.conf
volumes:
 - ./redis/redis.conf:/usr/local/etc/redis/redis.conf



回答3:


Unfortunately with Docker, things become a little tricky when it comes to Redis configuration file, and the answer voted as best (im sure from people that did'nt actually tested it) it DOESNT work.

But what DOES WORK, fast, and without husles is this:

 command: redis-server --bind redis-container-name --requirepass some-long-password --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes

You can pass all the variable options you want in the command section of the yaml docker file, by adding "--" in the front of it, followed by the variable value.

Never forget to set a password, and if possible close the port 6379.

Τhank me later.

PS: If you noticed at the command, i didnt use the typical 127.0.0.1, but instead the redis container name. This is done for the reason that docker assigns ip addresses internally via it's embedded dns server. In other words this bind address becomes dynamic, hence adding an extra layer of security.

If your redis container is called "redis" and you execute the command docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis (for verifying the running container's internal ip address), as far as docker is concerned, the command give in docker file, will be translated internally to something like: redis-server --bind 172.19.0.5 --requirepass some-long-password --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes




回答4:


It is an old question but I have a solution that seems elegant and I don't have to execute commands every time ;).

1 Create your dockerfile like this

#/bin/redis/Dockerfile
FROM redis
CMD ["redis-server", "--include /usr/local/etc/redis/redis.conf"]

What we are doing is telling the server to include that file in the Redis configuration. The settings you type there will override the default Redis have.

2 Create your docker-compose

redisall:
      build:
        context: ./bin/redis
      container_name: 'redisAll'
      restart: unless-stopped
      ports:
        - "6379:6379"
      volumes:
        - ./config/redis:/usr/local/etc/redis

3 Create your configuration file it has to be called the same as Dockerfile

//config/redis/redis.conf
requirepass some-long-password
appendonly yes

################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 loopback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.*
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1

 // and all configurations that can be specified
 // what you put here overwrites the default settings that have the
 container


来源:https://stackoverflow.com/questions/30547274/docker-compose-anyway-to-specify-a-redis-conf-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!