通过环境变量 docker-compose redis 密码

kar*_*baq 48 environment-variables redis docker docker-compose

我试图docker-compose通过环境变量传递我的 redis 密码,但它给了我错误。

这是我的 redis 镜像的一部分docker-compose.yml

  redis:
    image: redis
    container_name: redis
    # command: redis-server --requirepass mypassword <--- this works as expected
    # command: redis-server --requirepass ${REDIS_PASSWORD} <-- while this does not
    command: redis-server --requirepass $${REDIS_PASSWORD} <-- and this does not work either
    volumes:
      - redis:/var/lib/redis/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    ports:
      - "6379"
    env_file:
      - .env.prod
Run Code Online (Sandbox Code Playgroud)

我的.env.prod

REDIS_PASSWORD=mypassword
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误:

consumer: Cannot connect to redis://:**@redis:6379/0: WRONGPASS invalid username-password pair or user is disabled..
Run Code Online (Sandbox Code Playgroud)

但是如果我直接在docker-compose.yml没有环境变量的情况下指定密码,那么它就可以工作。

Cez*_*żak 22

没有一个答案对我有用。这是我最终所做的,调整为OP提供的代码片段:

\n
redis:\n  image: redis\n  container_name: redis\n  command:\n    - /bin/sh\n    - -c\n    # - Double dollars, so that the variable is not expanded by Docker Compose\n    # - Surround by quotes, so that the shell does not split the password\n    # - The ${variable:?message} syntax causes shell to exit with a non-zero\n    #   code and print a message, when the variable is not set or empty\n    - redis-server --requirepass "$${REDIS_PASSWORD:?REDIS_PASSWORD variable is not set}"\n  volumes:\n    - redis:/var/lib/redis/data\n    - ./redis.conf:/usr/local/etc/redis/redis.conf\n  ports:\n    - "6379"\n  env_file:\n    - .env.prod\n
Run Code Online (Sandbox Code Playgroud)\n

我更改了该command字段,以便通过 shell \xe2\x80\x94\n运行命令,这样,如果找不到变量,/bin/sh可以扩展变量或退出并显示错误消息\n。REDIS_PASSWORD

\n

至于为什么有问题的代码片段不起作用:

\n
    \n
  1. command: redis-server --requirepass ${REDIS_PASSWORD}

    \n

    在这种情况下,${REDIS_PASSWORD}将由 Docker Compose 扩展。\nDocker Compose 首先尝试查找名为\n 的环境变量REDIS_PASSWORD。然后,Docker Compose 查找文件.env(是的,即使\nenv_file提供了该字段)。因为变量是在文件中定义的\n.env.prod,因此 Compose 无法找到它。

    \n
  2. \n
  3. command: redis-server --requirepass $${REDIS_PASSWORD}

    \n

    此处,${REDIS_PASSWORD}未展开地传递给redis-server命令。\n这是因为 Docker直接redis-server运行命令,而不\n通过 shell。当用户在终端仿真器中输入该命令时,shell(通常是 Bash)会在运行该命令之前扩展该变量。

    \n
  4. \n
\n

来源

\n\n


phl*_*egx 16

这应该有效:

    redis:
        image: redis
        command: >
          --requirepass ${REDIS_PASSWORD}
Run Code Online (Sandbox Code Playgroud)

  • @syberkitten 请注意,您的链接与 Docker hub 上的 Redis 官方镜像不对应。您的解决方案似乎不适用于官方图像,但 Cezary Drożak 的答案对我有用 (5认同)
  • 记录的正确方法(https://hub.docker.com/r/bitnami/redis/)是提供一个变量 -&gt; 环境: - REDIS_PASSWORD=yourpass 您提供的内容不起作用,我正在执行:-- : 无效选项 (4认同)
  • @syberkitten你的链接指的是bitnami版本 (4认同)

Ben*_*Roe 13

这对我有用。\n类似于Cezary Dro\xc5\xbcak答案,但代码更少。

\n

docker-compose.yml

\n
  redis:\n    image: redis:alpine\n    restart: always\n    command: /bin/sh -c "redis-server --requirepass $$REDIS_HOST_PASSWORD"\n    env_file:\n      - redis.env\n
Run Code Online (Sandbox Code Playgroud)\n

redis.env

\n
REDIS_HOST_PASSWORD=mypassword\n
Run Code Online (Sandbox Code Playgroud)\n

来源

\n


Efr*_*isi 4

env_file允许在容器中设置环境变量 - 而您需要在 docker-compose 环境中设置环境变量,以便对${REDIS_PASSWORD}.

为了实现您的目标,请从您的 yml 中删除env_file,并且:

  • 将文件重命名.env.prod为 just .env,以便 docker-compose 会自动选择它;或者,
  • 在调用 docker-compose 时通过参数指定它--env-file
docker-compose --env-file .env.prod up
Run Code Online (Sandbox Code Playgroud)