0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Khắc Phục Lỗi Xây Dựng Docker: Hướng Dẫn Chi Tiết

Đăng vào 7 tháng trước

• 4 phút đọc

Khắc Phục Lỗi Xây Dựng Docker

Trong bài viết này, chúng ta sẽ tìm hiểu cách khắc phục các lỗi khi xây dựng Docker image thông qua một ví dụ thực tế. Việc sửa chữa Dockerfile để đáp ứng yêu cầu phát triển là một kỹ năng quan trọng trong quy trình DevOps.

Giới thiệu

Docker đã trở thành một phần không thể thiếu trong phát triển phần mềm hiện đại. Tuy nhiên, việc xây dựng các image Docker không phải lúc nào cũng diễn ra suôn sẻ. Trong bài viết này, tôi sẽ chia sẻ quá trình khắc phục lỗi xây dựng một Dockerfile trên App Server 2 để tạo ra một image mới theo yêu cầu phát triển.

Các Bước và Kết Quả

1. Phân Tích Vấn Đề Ban Đầu
Lần đầu tiên người dùng cố gắng xây dựng Docker image nhưng đã gặp phải nhiều lỗi cú pháp trong Dockerfile gốc.

Dockerfile Gốc Có Lỗi:

plaintext Copy
IMAGE httpd:2.4.43

ADD sed -i "s/Listen 80/Listen 8080/g" /usr/local/apache2/conf/httpd.conf

ADD sed -i '/LoadModule\ ssl_module modules\/mod_ssl.so/s/^#//g' conf/httpd.conf

ADD sed -i '/LoadModule\ socache_shmcb_module modules\/mod_socache_shmcb.so/s/^#//g' conf/httpd.conf

ADD sed -i '/Include\ conf\/extra\/httpd-ssl.conf/s/^#//g' conf/httpd.conf

COPY certs/server.crt /usr/local/apache2/conf/server.crt

COPY certs/server.key /usr/local/apache2/conf/server.key

COPY html/index.html /usr/local/apache2/htdocs/
  • IMAGE httpd:2.4.43 là sai; chỉ thị đúng là FROM.
  • Các lệnh sed đã bị tiền tố sai bằng ADD. ADD dùng để thêm tệp hoặc thư mục vào image. Để chạy các lệnh shell, cần sử dụng chỉ thị RUN.

2. Sửa Chữa Dockerfile
Tôi đã chỉnh sửa Dockerfile (/opt/docker/Dockerfile) để sửa các lỗi cú pháp.

Dockerfile Đã Sửa:

plaintext Copy
FROM httpd:2.4.43

RUN sed -i "s/Listen 80/Listen 8080/g" /usr/local/apache2/conf/httpd.conf
RUN sed -i '/LoadModule\ ssl_module modules\/mod_ssl.so/s/^#//g' conf/httpd.conf
RUN sed -i '/LoadModule\ socache_shmcb_module modules\/mod_socache_shmcb.so/s/^#//g' conf/httpd.conf
RUN sed -i '/Include\ conf\/extra\/httpd-ssl.conf/s/^#//g' conf/httpd.conf

COPY certs/server.crt /usr/local/apache2/conf/server.crt
COPY certs/server.key /usr/local/apache2/conf/server.key
COPY html/index.html /usr/local/apache2/htdocs/

3. Thử Nghiệm Xây Dựng Ban Đầu và Lỗi Mạng
Sau khi đã sửa cú pháp, lần đầu tiên thử xây dựng vẫn thất bại do lỗi timeout mạng. Client Docker không thể kéo image gốc từ mirror registry được cấu hình.

Lệnh:

plaintext Copy
docker build -t httpd_image .

Kết Quả:

plaintext Copy
...
=> ERROR [internal] load metadata for docker.io/library/httpd:2.4.43      61.0s
...
ERROR: failed to build: failed to solve: DeadlineExceeded: ... dial tcp 10.0.0.6:443: i/o timeout

4. Giải Quyết Vấn Đề Mạng
Để khắc phục timeout, tôi đã kéo thủ công image gốc. Hành động này sẽ lưu trữ image cục bộ, cho phép lệnh docker build tiếp theo sử dụng bản sao cục bộ thay vì cố gắng tải xuống từ mạng.

Lệnh:

plaintext Copy
docker pull httpd:2.4.43

Kết Quả:

plaintext Copy
2.4.43: Pulling from library/httpd
...
Status: Downloaded newer image for httpd:2.4.43
docker.io/library/httpd:2.4.43

5. Xây Dựng Thành Công Cuối Cùng
Với image gốc đã có sẵn cục bộ, lệnh xây dựng cuối cùng đã thực hiện thành công.

Lệnh:

plaintext Copy
docker build -t httpd_image .

Kết Quả:

plaintext Copy
[+] Building 8.6s (13/13) FINISHED ...
...
 => [1/8] FROM docker.io/library/httpd:2.4.43                             0.0s
...
 => [8/8] COPY html/index.html /usr/local/apache2/htdocs/                 0.6s
 => exporting to image                                                    2.2s
 => => exporting layers ...
 => => naming to docker.io/library/httpd_image                            0.0s

Kết quả cuối cùng xác nhận rằng quá trình xây dựng Docker đã thành công trong việc tạo ra image mới bằng cách thực hiện tất cả các bước đã chỉ định trong Dockerfile đã sửa.

Thực Hành Tốt Nhất

  • Kiểm tra cú pháp: Luôn kiểm tra cú pháp trong Dockerfile trước khi xây dựng để tránh lỗi không cần thiết.
  • Sử dụng lệnh RUN một cách chính xác: Đảm bảo rằng các lệnh shell được thực hiện bằng RUN thay vì ADD.
  • Quản lý kết nối mạng: Kiểm tra kết nối internet và mirror registry để tránh lỗi khi kéo image.

Cạm Bẫy Thường Gặp

  • Không chú ý đến thông báo lỗi: Các thông báo lỗi Docker thường cung cấp thông tin quý giá về những gì đã sai.
  • Quá phụ thuộc vào các image có sẵn: Đôi khi, việc tạo image từ đầu có thể là lựa chọn tốt hơn.

Mẹo Hiệu Suất

  • Sử dụng cache của Docker: Docker sẽ tự động sử dụng cache cho các bước không thay đổi, giúp giảm thời gian xây dựng.
  • Tối ưu hóa các lệnh COPY: Chỉ sao chép các tệp cần thiết để giảm kích thước image.

Khắc Phục Sự Cố

  • Nếu gặp phải sự cố không rõ nguyên nhân, thử thêm tùy chọn --no-cache vào lệnh docker build để xây dựng lại từ đầu mà không sử dụng cache.

Câu Hỏi Thường Gặp

  • Tại sao tôi không thể kéo image từ registry?
    Có thể có vấn đề với kết nối mạng hoặc registry không khả dụng.

  • Tôi có thể kiểm tra lỗi Dockerfile ở đâu?
    Sử dụng lệnh docker lint hoặc các công cụ kiểm tra Dockerfile trực tuyến.

Kết Luận

Khắc phục lỗi xây dựng Docker là một phần quan trọng trong quy trình phát triển. Bằng cách hiểu và sửa chữa các lỗi cú pháp cũng như xử lý các vấn đề mạng, bạn có thể đảm bảo rằng quá trình xây dựng diễn ra trơn tru. Hãy bắt tay vào thực hành ngay hôm nay và cải thiện kỹ năng DevOps của bạn!

Tài Nguyên Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào