Khi tôi chạy ứng dụng laravel của mình, tôi gặp lỗi Hình ảnh docker của Laravel Không thể mở tệp đầu vào. /var/www/html/nghệ nhân. Cuối cùng tôi đã tìm ra nguyên nhân cốt lõi của vấn đề, hãy để tôi chia sẻ nó với bạn
Tôi đã tạo ứng dụng của mình trong Laravel sail nhưng hiện tại tôi đang làm việc để làm cho ứng dụng chạy bên trong bộ chứa docker. Ứng dụng của tôi chạy tốt Tôi sử dụng docker-compose run nhưng trong quá trình xây dựng docker để tạo hình ảnh, tôi gặp lỗi
Vì tôi chạy nó trong một container docker, chúng tôi sẽ chẩn đoán bởi Laravel đang phàn nàn
TL;DR
Câu trả lời ngắn gọn là mã nguồn Laravel của bạn không thể truy cập được bởi tiến trình đang cố chạy nó
Trong trường hợp của tôi, tôi chạy Laravel trong bộ chứa docker bằng cách sử dụng
could not open input file: artisan
1Để bắt đầu, tôi chạy ứng dụng bằng lệnh
could not open input file: artisan
2 [xem bên dưới cấu hình mà tôi có]. Nó hoạt động tốt vì tôi có một tập đĩa được liên kết với mã nguồn [xem dòng đơn giản bên dưới]. Điều này có nghĩa là quy trình could not open input file: artisan
3 có quyền truy cập vào mã nguồn, vì vậy nó đã hoạt độngKhi tôi chạy quy trình xây dựng để tạo hình ảnh docker của mình
could not open input file: artisan
4, không có liên kết nào đến mã nguồn [xem đường chấm chấm bên dưới]. Vì vậy, quá trình xây dựng không thành công với lỗi đóLaravel docker image Could not open input file: /var/www/html/artisan
tùy thuộc vào thiết lập của bạn, bạn có thể nhận được thông báo lỗi thay thế này
could not open input file: artisan
Đây là một lược đồ thiết lập của tôi
graph
direction LR;
A[Source code]
B[docker-compose up process]
C[docker build process]
B-->A
C-.->A
thiết lập của tôi
Thiết lập của tôi khá giống với thiết lập laravel mà tôi đã làm với docker trong bài viết này. Ý tưởng là gói ứng dụng của bạn bên trong một hình ảnh docker, sau đó sử dụng hình ảnh đó trong các dịch vụ docker khác để xây dựng thứ gì đó lớn hơn
Kịch bản để bắt đầu vùng chứa
Tôi đã tạo tập lệnh này để chạy các bước cần thiết để khởi động ứng dụng
Nó xử lý các vấn đề về quyền và sau đó sử dụng ________ 01 để khởi động ứng dụng
Ở giai đoạn này, mã nguồn của ứng dụng được giả định là trong hình ảnh vùng chứa
could not open input file: artisan
6#!/usr/bin/env bash
if [ ! -z "$WWWUSER" ]; then
usermod -u $WWWUSER sail
fi
if [ ! -d /.composer ]; then
mkdir /.composer
fi
chmod -R ugo+rw /.composer
if [ $# -gt 0 ];then
exec gosu $WWWUSER "[email protected]"
else
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi
Tệp cấu hình
could not open input file: artisan
1 bên dướicould not open input file: artisan
1Dockerfile để xây dựng hình ảnh
Đây là Dockerfile tôi đã sử dụng để xây dựng hình ảnh. Bạn có thể thấy rằng không có hướng dẫn sao chép mã nguồn bên trong hình ảnh vùng chứa
Nhưng ở cuối tệp có lệnh ENTRYTPOINT yêu cầu vùng chứa chạy tập lệnh mà chúng ta đã tạo ở trên
could not open input file: artisan
2Thiết lập docker-compose
Đây là ngăn xếp docker-compose của tôi. Nó được thiết kế để đóng gói mọi thứ lại với nhau. Ứng dụng Laravel được xây dựng từ
could not open input file: artisan
8 mà chúng ta đã tạo trước đâyNó ánh xạ mã nguồn từ thư mục hiện tại [nơi đặt
could not open input file: artisan
9]could not open input file: artisan
5Vấn đề
Tại sao nó không thành công trong quá trình xây dựng docker
Nguyên nhân gốc rễ liên quan đến sự hiện diện của mã nguồn
Lỗi bên dưới được đưa ra khi
- xây dựng hình ảnh vùng chứa
- ENTRYPOINT chạy tập lệnh để khởi động vùng chứa
1 cố gắng chạy mã và sau đó 💥 [mã nguồn bị thiếu]could not open input file: artisan
Laravel docker image Could not open input file: /var/www/html/artisan
Tại sao nó hoạt động trong thời gian
Khi tôi chạy ứng dụng bằng lệnh
could not open input file: artisan
2. Nó hoạt động tốt vì tôi có một tập được liên kết với mã nguồncould not open input file: artisan
9Điều này có nghĩa là quy trình
could not open input file: artisan
3 có quyền truy cập vào mã nguồn, vì vậy nó đã hoạt độngGiải pháp
Để giải quyết vấn đề, bạn cần thêm lệnh COPY vào tệp
could not open input file: artisan
8Mã nguồn nằm trong thư mục hiện tại. Hướng dẫn sẽ sao chép nguồn vào ví dụ
could not open input file: artisan
2Đây là Dockerfile hoàn chỉnh
could not open input file: artisan
0Phần kết luận
Thật tuyệt khi có thể xác định nguyên nhân gốc rễ. Hy vọng bạn thích nó. Hãy cùng chia sẻ suy nghĩ của bạn tại phần bình luận