You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose启动报错:No closing quotation 问题求助

Docker Compose Redis命令解析报错:No closing quotation 解决方法

错误信息

ERROR: for 36b488ac7408_pcare_redis_1  No closing quotation

ERROR: for redis  No closing quotation
Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose\cli\main.py", line 81, in main
  File "compose\cli\main.py", line 203, in perform_command
  File "compose\metrics\decorator.py", line 18, in wrapper
  File "compose\cli\main.py", line 1186, in up
  File "compose\cli\main.py", line 1166, in up
  File "compose\project.py", line 697, in up
  File "compose\parallel.py", line 108, in parallel_execute
  File "compose\parallel.py", line 206, in producer
  File "compose\project.py", line 679, in do
  File "compose\service.py", line 579, in execute_convergence_plan
  File "compose\service.py", line 499, in _execute_convergence_recreate
  File "compose\parallel.py", line 108, in parallel_execute
  File "compose\parallel.py", line 206, in producer
  File "compose\service.py", line 494, in recreate
  File "compose\service.py", line 612, in recreate_container
  File "compose\service.py", line 341, in create_container
  File "compose\container.py", line 48, in create
  File "docker\api\container.py", line 422, in create_container
  File "docker\api\container.py", line 433, in create_container_config
  File "docker\types\containers.py", line 703, in __init__
  File "docker\utils\utils.py", line 464, in split_command
  File "shlex.py", line 315, in split
  File "shlex.py", line 300, in __next__
  File "shlex.py", line 109, in get_token
  File "shlex.py", line 191, in read_token
ValueError: No closing quotation
[17476] Failed to execute script docker-compose

原配置文件

docker-compose.yml

version: '3'
services:
  db:
    restart: unless-stopped
    image: 'postgres:13'
    environment:
      PGPASSWORD: '${DB_PASSWORD:-secret}'
      POSTGRES_DB: '${DB_DATABASE}'
      POSTGRES_USER: '${DB_USERNAME}'
      POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
    healthcheck:
      test: ["CMD", "pg_isready","-U","${DB_USERNAME}","-d","${DB_DATABASE}","-p","${DB_PORT}"]
      interval: 5s
      timeout: 5s
      retries: 3
    command: -p ${DB_PORT}
    ports:
      - "${DB_PORT}:${DB_PORT}"
  redis:
    image: 'redis:alpine'
    restart: unless-stopped
    command: 'redis-server --requirepass ${REDIS_PASSWORD} --port ${REDIS_PORT}'
    healthcheck:
      test: ["CMD", "redis-cli","-p","${REDIS_PORT}", "ping"]
      retries: 3
      timeout: 5s
      interval: 5s
    ports:
      - "${REDIS_PORT}"

.env

DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=6000
DB_DATABASE=test1
DB_USERNAME=test1
DB_PASSWORD=test1


REDIS_HOST=localhost
REDIS_PASSWORD='L\Cm;=9YV$v<{4,eLs/AN4[g{dA"R4wy'
REDIS_PORT=6001

问题原因

  1. .env变量格式错误:REDIS_PASSWORD的值被单引号包裹,而.env中变量赋值不需要加引号,这会导致单引号被当作密码的一部分。同时密码本身包含双引号",当变量替换到被单引号包裹的redis command字段时,双引号会提前闭合外层单引号,造成shell解析器找不到匹配的闭合引号。
  2. 字符串格式的command易冲突:用单引号包裹整个命令字符串,当变量值包含特殊字符(引号、反斜杠等)时,极易触发解析错误。

解决方案

1. 修正.env文件中的REDIS_PASSWORD

去掉密码值的单引号,直接保留原始密码:

REDIS_PASSWORD=L\Cm;=9YV$v<{4,eLs/AN4[g{dA"R4wy

2. 修改docker-compose.yml中redis的command为数组格式

使用YAML数组传递命令参数,避免shell解析带来的特殊字符冲突:

redis:
  image: 'redis:alpine'
  restart: unless-stopped
  command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--port", "${REDIS_PORT}"]
  healthcheck:
    test: ["CMD", "redis-cli","-p","${REDIS_PORT}", "ping"]
    retries: 3
    timeout: 5s
    interval: 5s
  ports:
    - "${REDIS_PORT}"

原理说明

  • .env文件中变量赋值不需要引号,添加引号会将引号纳入变量值本身,引发后续解析问题。
  • 使用数组格式的command,Docker会直接将每个数组元素作为命令的独立参数传递,无需经过shell的字符串拆分和解析,彻底避免特殊字符导致的引号冲突。

内容的提问来源于stack exchange,提问作者Crazynds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:35:18