Dockerfile php với nhà soạn nhạc

Khi chạy lệnh "ADD" trong Dockerfile, trên Docker cho Windows, thao tác này sẽ sao chép các tệp thay vì sao chép Symlink

Điều này có tác dụng làm thay đổi các tệp này (trong Gói phân phối) không xuất hiện bên trong bộ chứa Docker; . e. sửa đổi các lớp không xuất hiện

Để khắc phục điều này, bạn cần thêm mọi gói từ DistributionPackages vào khối ổ đĩa của docker-compose. tập tin yml

Thí dụ

Ví dụ: hãy lấy cấu trúc tệp sau - chúng tôi có gói trang web và gói "bình thường" trong Gói phân phối

Vài ngày trước, tôi phải làm việc với một thiết lập ứng dụng web PHP Slim rất đơn giản được chứa hoàn toàn bằng Docker. Tôi đã quản lý nó để làm cho nó hoạt động bằng bộ chứa Nginx Docker, bộ chứa PHP-FPM và bộ chứa ứng dụng Slim. Tất cả đều hoạt động tốt khi tôi bắt đầu vật lộn với vấn đề xây dựng docker Compose khi cố gắng cài đặt các phụ thuộc PHP của mình bằng Trình soạn thảo, bên trong các bước xây dựng bộ chứa của Dockerfile (đây là các bước được thực thi khi bạn chạy bản dựng dockercompose). Tôi quyết định chia sẻ với bạn vấn đề này và một vài cách giải quyết mà bạn có thể áp dụng khi đối mặt với nó, với một ví dụ đơn giản nhưng thực tế

Ví dụ thiết lập dự án cơ bản

Vì vậy, để bắt đầu, hãy xem xét cấu trúc dự án sau

/php
composer.json
main.php
php.Dockerfile
docker-compose.yml

Một cấu trúc khá cơ bản và tối thiểu cho một dự án PHP nhỏ, sử dụng Trình soạn thảo để xác định các phụ thuộc của nó. Chúng ta hãy xem docker-compose. tập tin yml

services:
php:
container_name: my_php_container__
build:
context: ./php
dockerfile: ./php.Dockerfile
volumes:
- ./php/:/usr/src/myapp

Điều này chỉ xác định một dịch vụ PHP, sử dụng một ổ đĩa được chia sẻ với thư mục/php và các hướng dẫn Dockerfile của nó được xác định trong tệp php. tập tin dockerfile. Hãy xem nó

FROM php:7.4-cli# INSTALL ZIP TO USE COMPOSER
RUN apt-get update && apt-get install -y \
zlib1g-dev \
libzip-dev \
unzip
RUN docker-php-ext-install zip
# INSTALL AND UPDATE COMPOSER
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN composer self-update
WORKDIR /usr/src/myapp
COPY . .
# INSTALL YOUR DEPENDENCIES
RUN composer install
CMD php main.php

Ở đây chúng tôi bắt đầu từ một PHPv7. 4 hình ảnh; . tập tin php

Hãy giả sử chính của chúng tôi. php của bạn chỉ đơn giản như sau

require './vendor/autoload.php';
use Carbon\Carbon;
printf("Right now is %s\n", Carbon::now()->toDateTimeString());printf(
"Right now in Vancouver is %s\n",
Carbon::now('America/Vancouver')
);
printf("Tomorrow will be %s\n", Carbon::now()->addDay());

Để điều này hoạt động thành công, chúng tôi sẽ cần cài đặt phần phụ thuộc Carbon PHP, vì vậy nhà soạn nhạc của chúng tôi. tệp json có thể trông giống như

{
"name": "test/app",
"description": "Simple PHP Composer app",
"type": "project",
"require": {
"nesbot/carbon": "^2.57"
}
}
Sự cố thư mục “nhà cung cấp” bị thiếu

Với thiết lập được cung cấp trước đó, chúng tôi nghĩ sẽ không có gì sai sót nếu chúng tôi chạy

services:
php:
container_name: my_php_container__
build:
context: ./php
dockerfile: ./php.Dockerfile
volumes:
- ./php/:/usr/src/myapp
0. Chà, hãy thay đổi và thử xem

Như chúng ta có thể thấy, PHP không thể tìm thấy thư mục nhà cung cấp sẽ được tạo khi cài đặt trình soạn thảo được thực thi. Lưu ý rằng nhà soạn nhạc. tập tin khóa cũng không tồn tại. Vậy…, chuyện gì đang xảy ra ở đây vậy?

Tôi mất vài giờ để tìm ra nó, nhưng kết quả xảy ra khá đơn giản. khi xây dựng bộ chứa Docker PHP, docker thực thi từng bước xây dựng được xác định trong Dockerfile, do đó, chạy lệnh cài đặt trình soạn thảo và tạo thư mục /vendors và trình soạn thảo. khóa tập tin như mong đợi. Tại thời điểm này, các tệp này chỉ tồn tại trong hệ thống tệp vùng chứa. Khi docker soạn thảo được thực thi, Docker sẽ gắn hệ thống tệp của máy chủ (máy của chúng tôi) vào hệ thống tệp của vùng chứa, do đó ghi đè lên các tệp vùng chứa. Đó là khi thư mục /vendors và nhà soạn nhạc. lock bị xóa khỏi hệ thống tệp của vùng chứa. Vì Docker không gắn các ổ đĩa đã chỉ định trong giai đoạn xây dựng nên tất cả các tệp được lưu trữ bên trong vùng chứa trong giai đoạn xây dựng này sẽ bị xóa và thay thế bằng các tệp bạn đang lưu trữ trong thư mục /php khi bạn khởi động vùng chứa. Ghi nhớ điều này, lưu ý rằng BẢN SAO. . hướng dẫn chúng tôi xác định trong php. Dockerfile vô dụng và chúng tôi có thể xóa nó mà không tạo ra kết quả không mong muốn

3 giải pháp thay thế để ngăn sự cố thư mục “nhà cung cấp” bị thiếu

Để tránh gặp sự cố này, chúng ta phải xóa lệnh

services:
php:
container_name: my_php_container__
build:
context: ./php
dockerfile: ./php.Dockerfile
volumes:
- ./php/:/usr/src/myapp
1 khỏi tệp php. tập tin dockerfile. Nếu không có điều này, chúng tôi sẽ không cài đặt các phụ thuộc PHP sau khi bộ chứa được tạo, vì vậy chúng tôi sẽ phải chạy bước này sau đó, tại thời điểm khởi động bộ chứa. Ở đây tôi cung cấp 3 lựa chọn thay thế để làm điều này, bắt đầu với những lựa chọn đơn giản nhất

Cài đặt thủ công các phụ thuộc sau mỗi bản dựng soạn thảo docker

Như tiêu đề tự mô tả này gợi ý, chúng ta chỉ cần cài đặt thủ công các phụ thuộc PHP mà chúng ta cần mỗi khi xây dựng vùng chứa. Điều này dường như hoạt động nếu chúng tôi chắc chắn rằng chúng tôi sẽ không cần chạy trình soạn nhạc cài đặt nhiều hơn chỉ một vài lần cho một dự án

Chúng ta có thể cài đặt các phụ thuộc PHP của trình soạn thảo thông qua lệnh chạy soạn thảo docker, như thế này

docker compose run php composer install

Lưu ý rằng sau khi chạy lệnh này, chúng ta sẽ có trình soạn thảo. các tệp lock và /vendor đã tồn tại trong cấu trúc tệp dự án ban đầu của chúng tôi

Cài đặt các phụ thuộc mỗi khi vùng chứa được khởi động

php. Dockerfile chúng tôi đang sử dụng thực thi lệnh

services:
php:
container_name: my_php_container__
build:
context: ./php
dockerfile: ./php.Dockerfile
volumes:
- ./php/:/usr/src/myapp
2 làm lệnh bắt đầu cho bộ chứa PHP. Ở đây chúng ta có thể bao gồm thêm bước cài đặt các phụ thuộc PHP bằng cách sửa đổi nó thành

CMD bash -c "composer install && php main.php"

Với cách tiếp cận này, chúng tôi sẽ không cần quan tâm đến việc cài đặt thủ công các phụ thuộc PHP của chúng tôi mỗi khi chúng tôi xây dựng vùng chứa. Bất cứ khi nào chúng tôi thực thi soạn thảo docker, trước tiên, điều này sẽ kiểm tra tất cả trạng thái gói, cài đặt những cái còn thiếu và chạy ứng dụng của chúng tôi

Cài đặt các phụ thuộc một lần trong quá trình xây dựng soạn thảo docker, bằng cách xác định phạm vi liên kết âm lượng

Có một cách để chúng ta có thể đạt được cài đặt phụ thuộc PHP chỉ trong quá trình thực thi bản dựng soạn thảo docker. Vì trong thiết lập trước đây của chúng tôi, chúng tôi đang liên kết thư mục gốc với hệ thống tệp của bộ chứa, tất cả các tệp sẽ bị ghi đè khi chúng tôi khởi động bộ chứa. Chúng tôi chỉ có thể xác định phạm vi liên kết này để chỉ có một loạt các tệp của chúng tôi được liên kết với hệ thống tệp của vùng chứa

Giả sử chúng ta chỉ muốn liên kết. các tệp php và trình soạn thảo. json với hệ thống tệp của vùng chứa, do đó, bất kỳ thay đổi nào được thực hiện đối với các tệp đó, cả từ máy của chúng tôi hoặc từ bên trong vùng chứa, sẽ được phản ánh theo cả hai hướng. Chúng ta cần sửa đổi docker-compose. yml để thông báo rõ ràng tệp nào chúng tôi muốn liên kết/liên kết

services:
php:
container_name: my_php_container__
build:
context: ./php
dockerfile: ./php.Dockerfile
volumes:
- ./php/main.php:/usr/src/myapp/main.php
- ./php/composer.json:/usr/src/myapp/composer.json

Với điều đó, php của chúng tôi. Dockerfile có thể chịu trách nhiệm cài đặt các phụ thuộc của nhà soạn nhạc

...
WORKDIR /usr/src/myapp
COPY *.json . # copy the composer.json file
COPY *.php . # copy the php source files
# INSTALL YOUR DEPENDENCIES
RUN composer install
CMD php main.php

Mỗi khi chúng tôi chạy bản dựng soạn thảo docker, các phụ thuộc PHP của chúng tôi sẽ được cài đặt, một thư mục /vendors sẽ được tạo cũng như một trình soạn thảo. lock, NHƯNG CHỈ BÊN TRONG CONTAINER. Do đó, chúng tôi sẽ không thể xem các tệp này trong máy chủ của mình. Dù sao đi nữa, vì tất cả những gì chúng ta cần sẽ nằm trong chính vùng chứa, chúng ta sẽ có thể chạy docker Compose up và xem kết quả như mong đợi

docker compose up
[+] Running 1/0
- Container my_php_container__ Created 0.0s Attaching to my_php_container__
my_php_container__ | Right now is 2022-04-14 14:31:04
my_php_container__ | Right now in Vancouver is 2022-04-14 07:31:04
my_php_container__ | Tomorrow will be 2022-04-15 14:31:04
my_php_container__ exited with code 0

Ngoài ra, nếu chúng tôi cài đặt một phụ thuộc PHP mới bằng Trình soạn thảo (trình soạn thảo cài đặt XXX), thì yêu cầu mới đó sẽ được đưa vào trình soạn thảo của chúng tôi. json, cho phép chúng tôi luôn có tất cả các phụ thuộc cần thiết được liệt kê ở đó, ở định dạng di động thú vị (không có gì xấu, uh?). Một cái gì đó tương tự sẽ xảy ra với. tập tin php. chúng tôi sẽ có thể chỉnh sửa các tệp này trong máy chủ của mình và các thay đổi sẽ được phản ánh trong phiên bản tệp của vùng chứa. Đối với điều đó, bạn thậm chí có thể có một thư mục /src với tất cả. php ở đó và chỉ cần liên kết thư mục đó vào vùng chứa

Làm cách nào để sử dụng Trình soạn thảo PHP trong docker?

Đảm bảo có cùng phiên bản PHP trong bộ chứa trình soạn thảo của bạn như trong bộ chứa PHP của bạn. .
Cài đặt trình soạn nhạc và Docker. Composer là trình quản lý phụ thuộc PHP, tương tự như NPM cho Node. .
Kiểm tra dự án (hoặc bắt đầu từ đầu).
Thiết lập docker-compose. .
Xây dựng và chạy. .
Đi qua công cụ thiết lập. .
điều chỉnh docker-compose

Làm cách nào để tạo Dockerfile cho ứng dụng PHP?

Cụ thể, bạn sẽ học cách. .
Cài đặt Docker
Chạy hình ảnh Docker
Xây dựng hình ảnh khách hàng để chạy chương trình
Sử dụng Docker Compose để thiết lập môi trường dev
Chạy ứng dụng của chúng tôi trong Heroku
Kiểm tra ứng dụng của chúng tôi với Tích hợp liên tục (CI)
Triển khai ứng dụng của bạn với Triển khai liên tục (CD)

Làm cách nào để sử dụng Trình soạn thảo trong PHP?

Để định cấu hình Trình soạn thảo cho ứng dụng PHP của bạn .
Tạo nhà soạn nhạc của bạn. .
Xác minh rằng một nhà soạn nhạc. .
Chạy cài đặt nhà soạn nhạc (trên máy cục bộ của bạn) để cài đặt các gói cần thiết và tạo một nhà soạn nhạc. .
Cam kết nhà soạn nhạc. .
Trong Engine Yard Cloud, nhấp vào Công cụ > Bảng điều khiển
Chọn một môi trường bằng cách nhấp vào tên môi trường

Làm cách nào để cài đặt các tiện ích mở rộng PHP trong docker?

Dễ dàng cài đặt các tiện ích mở rộng PHP trong hình ảnh PHP Docker chính thức Cách sử dụng Tải xuống tập lệnh nhanh chóng Với Dockerfile Với curl Với thực thi trực tiếp từ curl .