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
问题原因
- .env变量格式错误:REDIS_PASSWORD的值被单引号包裹,而.env中变量赋值不需要加引号,这会导致单引号被当作密码的一部分。同时密码本身包含双引号
",当变量替换到被单引号包裹的redis command字段时,双引号会提前闭合外层单引号,造成shell解析器找不到匹配的闭合引号。 - 字符串格式的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
相关产品推荐
相关产品推荐

