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提供的代码片段:
\nredis:\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\nRun Code Online (Sandbox Code Playgroud)\n我更改了该command字段,以便通过 shell \xe2\x80\x94\n运行命令,这样,如果找不到变量,/bin/sh可以扩展变量或退出并显示错误消息\n。REDIS_PASSWORD
至于为什么有问题的代码片段不起作用:
\ncommand: redis-server --requirepass ${REDIS_PASSWORD}
在这种情况下,${REDIS_PASSWORD}将由 Docker Compose 扩展。\nDocker Compose 首先尝试查找名为\n 的环境变量REDIS_PASSWORD。然后,Docker Compose 查找文件.env(是的,即使\nenv_file提供了该字段)。因为变量是在文件中定义的\n.env.prod,因此 Compose 无法找到它。
command: redis-server --requirepass $${REDIS_PASSWORD}
此处,${REDIS_PASSWORD}未展开地传递给redis-server命令。\n这是因为 Docker直接redis-server运行命令,而不\n通过 shell。当用户在终端仿真器中输入该命令时,shell(通常是 Bash)会在运行该命令之前扩展该变量。
${variable:?message}语法phl*_*egx 16
这应该有效:
redis:
image: redis
command: >
--requirepass ${REDIS_PASSWORD}
Run Code Online (Sandbox Code Playgroud)
Ben*_*Roe 13
这对我有用。\n类似于Cezary Dro\xc5\xbcak答案,但代码更少。
\ndocker-compose.yml
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\nRun Code Online (Sandbox Code Playgroud)\nredis.env
REDIS_HOST_PASSWORD=mypassword\nRun Code Online (Sandbox Code Playgroud)\n\n
env_file允许在容器中设置环境变量 - 而您需要在 docker-compose 环境中设置环境变量,以便对${REDIS_PASSWORD}.
为了实现您的目标,请从您的 yml 中删除env_file,并且:
.env.prod为 just .env,以便 docker-compose 会自动选择它;或者,--env-file:docker-compose --env-file .env.prod up
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65169 次 |
| 最近记录: |