Sửa lỗi 'invalid interpolation format' trong Docker Compose khi dùng dấu đô la ($)

beginner🐳 Docker2026-05-30| Docker Compose (V1 hoặc V2), Linux, macOS, hoặc Windows

Error Message

Invalid interpolation format for "environment" option in service "web": "${VARIABLE}"
#docker-compose#bien-moi-truong#interpolation#dau-do-la#thoat-chuoi

Vấn đềMọi chuyện thường bắt đầu bằng một bản cập nhật thông thường. Bạn thêm mật khẩu cơ sở dữ liệu mới hoặc biến cấu hình Nginx vào file docker-compose.yml, chạy docker compose up, và rồi quá trình dừng lại đột ngột. Thay vì container hoạt động, bạn nhận được một thông báo lỗi khó hiểu:

Invalid interpolation format for "environment" option in service "web": "${VARIABLE}"

Docker Compose đang cố gắng hỗ trợ bạn. Nó phát hiện ký hiệu $ và giả định rằng bạn đang tham chiếu một biến từ máy chủ (host) hoặc từ file .env. Khi chuỗi không khớp với định dạng mong đợi cho việc nội suy (interpolation), bộ phân tích cú pháp sẽ báo lỗi cú pháp và từ chối khởi động dịch vụ.

Tại sao lỗi này xảy raDocker Compose dành riêng dấu đô la ($) cho việc nội suy biến (variable interpolation). Tính năng này rất tuyệt để thiết lập các giá trị động như IMAGE_VERSION=${VERSION}. Tuy nhiên, nó trở thành một rắc rối lớn khi dữ liệu thực tế của bạn—như mật khẩu Redis, một mẫu regex hoặc biến Nginx—có chứa ký tự $.

Bên dưới hệ thống, bộ phân tích YAML tìm kiếm các mẫu như $VARIABLE hoặc ${VARIABLE}. Nếu thấy dấu $ theo sau bởi văn bản mà nó không nhận diện được là một biến hợp lệ, hoặc nếu biến đó không được định nghĩa ở đâu, hệ thống sẽ báo lỗi để ngăn chặn việc rò rỉ cấu hình.

Giải pháp: Thoát chuỗi bằng hai dấu đô laCách khắc phục rất đơn giản, mặc dù cú pháp này dễ bị bỏ qua nếu bạn không quen với quy tắc thoát chuỗi (escaping) của Compose. Để yêu cầu Docker Compose coi dấu đô la là một ký tự thông thường, bạn phải sử dụng hai dấu đô la ($$).

Ví dụ: Sửa mật khẩu phức tạpGiả sử mật khẩu cơ sở dữ liệu của bạn là P@$sW0rd2024. Một cấu hình tiêu chuẩn (và sẽ thất bại) có thể trông như thế này:

services:
  web:
    image: node:20-alpine
    environment:
      - DB_PASSWORD=P@$sW0rd2024  # Dòng này gây ra lỗi

Để sửa lỗi, chỉ cần nhân đôi dấu đô la đó:

services:
  web:
    image: node:20-alpine
    environment:
      - DB_PASSWORD=P@$$sW0rd2024 # Compose sẽ hiểu đây là một dấu $ duy nhất

Khi container khởi động, ứng dụng của bạn sẽ thấy biến DB_PASSWORD chính xác như mong đợi: P@$sW0rd2024.

Xử lý Nginx và các lệnh ShellLỗi này cực kỳ phổ biến khi truyền các đoạn mã shell hoặc biến Nginx (như $host hoặc $remote_addr) qua Compose. Nếu không thoát chuỗi, chúng sẽ luôn thất bại. Hãy xem ví dụ về định dạng log Nginx này:

# SAI - Dòng này gây ra lỗi nội suy
  environment:
    - LOG_FORMAT=$remote_addr - $remote_user [$time_local]
# ĐÚNG - Đã được thoát chuỗi đúng cách cho Docker Compose
  environment:
    - LOG_FORMAT=$$remote_addr - $$remote_user [$$time_local]

Cách tiếp cận sạch sẽ hơn: Sử dụng file .envViệc thoát chuỗi cho mọi dấu đô la có thể nhanh chóng làm cho file YAML trở nên lộn xộn và khó đọc. Một chiến lược dễ bảo trì hơn là chuyển các giá trị này vào file .env. Docker Compose xử lý các biến khác đi khi chúng được tải từ các file bên ngoài.

  • Tạo một file .env ở thư mục gốc của dự án.- Thêm các giá trị thực tế của bạn mà không cần thoát chuỗi chúng.File .env:
DB_PASSWORD=P@$sW0rd2024

File docker-compose.yml:

services:
  web:
    environment:
      - DB_PASSWORD=${DB_PASSWORD}

Trong quy trình này, Compose lấy chuỗi từ file .env và đưa nó vào YAML. Điều này giúp bỏ qua các vấn đề nội suy thường xảy ra khi bộ phân tích đọc trực tiếp file YAML.

Xác minhLuôn tốt hơn nếu bạn kiểm tra lại kết quả sau khi container đã chạy. Bạn có thể xác minh các giá trị qua hai bước.

1. Sử dụng lệnh ConfigChạy lệnh docker compose config để xem engine diễn giải file YAML của bạn như thế nào mà không cần khởi động container. Kiểm tra phần environment; nếu bạn đã dùng $$, kết quả đầu ra sẽ hiển thị một dấu $ duy nhất.

2. Kiểm tra Container đang chạySau khi container hoạt động, hãy chạy lệnh sau để xem các biến môi trường thực tế mà ứng dụng của bạn nhận được:

docker exec -it [container_name] env | grep DB_PASSWORD

Nếu kết quả hiển thị DB_PASSWORD=P@$sW0rd2024, bạn đã giải quyết xong vấn đề.

Tổng kếtLỗi "invalid interpolation format" hầu như luôn là dấu hiệu của một dấu $ chưa được thoát chuỗi trong file YAML của bạn. Hãy ghi nhớ hai quy tắc này: Sử dụng $$ cho các dấu đô la thực tế bên trong docker-compose.yml, hoặc chuyển các bí mật thô vào file .env để giữ cho cấu hình của bạn sạch sẽ và không bị lỗi.

Related Error Notes