Chào mọi người,
Mình viết bài này để chia sẻ một lỗi khá "khó đỡ" mình vừa gặp phải khi sử dụng bộ OLS Docker trên Windows và cách khắc phục. Hy vọng sẽ giúp ai đó tiết kiệm được thời gian.
Mô tả vấn đề
Khi mình chạy script để tạo database hoặc thực hiện các tác vụ liên quan đến cơ sở dữ liệu trong môi trường OLS Docker, mình liên tục nhận được thông báo lỗi:
[X] DB access failed, please check!
Mình đã kiểm tra đi kiểm tra lại các thông tin trong file .env như MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD và chắc chắn 100% là chúng đã chính xác. Mình cũng đã thử đăng nhập vào MariaDB/MySQL trực tiếp bên trong container bằng các thông tin đó và hoàn toàn thành công. Mọi thứ dường như đều đúng nhưng script vẫn báo lỗi.
Nguyên nhân gốc rễ
Sau một hồi tìm hiểu, mình phát hiện ra nguyên nhân không nằm ở giá trị của các biến môi trường, mà nằm ở định dạng xuống dòng (End of Line - EOL) của file .env.


- Các script shell (
.sh) chạy trong môi trường Linux (bên trong container Docker) yêu cầu định dạng xuống dòng là LF (Line Feed).
- Tuy nhiên, do mình chỉnh sửa file
.env trên Windows, các trình soạn thảo văn bản mặc định (như Notepad) hoặc một số IDE không được cấu hình sẽ lưu file với định dạng CRLF (Carriage Return + Line Feed).
Khi script .sh đọc file .env có định dạng CRLF, một ký tự "vô hình" là \r (Carriage Return) sẽ bị dính vào cuối mỗi giá trị. Ví dụ, thay vì đọc mật khẩu là dev, script sẽ đọc thành dev\r. Điều này làm cho mật khẩu, tên người dùng, hoặc tên database bị sai lệch, dẫn đến việc kết nối tới DB thất bại.
Cách khắc phục
Cách giải quyết rất đơn giản: Chuyển đổi định dạng xuống dòng của file .env từ CRLF sang LF.
Hầu hết các trình soạn thảo code hiện đại đều hỗ trợ việc này. Dưới đây là cách thực hiện với Visual Studio Code (VS Code):
- Mở file
.env trong VS Code.
- Nhìn xuống góc dưới cùng bên phải của cửa sổ, bạn sẽ thấy chữ CRLF.
- Nhấp chuột vào chữ CRLF đó.
- Một menu lựa chọn sẽ hiện ra ở phía trên. Hãy chọn LF.
- Lưu file lại (Ctrl + S).
Sau khi lưu file .env với định dạng LF, bạn hãy chạy lại script và vấn đề sẽ được giải quyết.
Tổng kết
Đây là một lỗi phổ biến khi làm việc với các môi trường dựa trên Linux (như Docker) từ máy tính Windows. Sự khác biệt về định dạng file có thể gây ra những lỗi khó tìm. Nếu bạn gặp lỗi tương tự, hãy kiểm tra định dạng EOL của các file cấu hình trước tiên!
Chúc các bạn thành công!