Codefresh có thể làm việc với các dự án Php sử dụng bất kỳ framework phổ biến nào [Laravel, Symphony, CakePHp, v.v. ]
Dự án php ví dụ
Bạn có thể xem dự án ví dụ tại https. //github. com/codefresh-contrib/php-composer-sample-app. Kho lưu trữ chứa một dự án Php đơn giản sử dụng trình soạn thảo làm trình quản lý gói
Dockerfile sử dụng các bản dựng nhiều giai đoạn để giảm thiểu kích thước của hình ảnh docker
version: '1.0'
steps:
main_clone:
title: Cloning main repository...
type: git-clone
repo: 'codefresh-contrib/php-composer-sample-app'
revision: master
git: github
MyAppDockerImage:
title: Building Docker Image
type: build
image_name: my-php-image
working_directory: ./
tag: master
dockerfile: Dockerfile
9FROM composer:1.9.3 as vendor
WORKDIR /tmp/
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
FROM php:7.2-apache-stretch
COPY . /var/www/html
COPY --from=vendor /tmp/vendor/ /var/www/html/vendor/
Tạo hình ảnh Docker cho dự án Php
Một đường dẫn ví dụ cũng được cung cấp trong kho git. Nó chỉ chứa hai bước. Một bước nhân bản để tìm nạp mã và một bước xây dựng để tạo hình ảnh Docker
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php0
version: '1.0'
steps:
main_clone:
title: Cloning main repository...
type: git-clone
repo: 'codefresh-contrib/php-composer-sample-app'
revision: master
git: github
MyAppDockerImage:
title: Building Docker Image
type: build
image_name: my-php-image
working_directory: ./
tag: master
dockerfile: Dockerfile
Khi bạn chạy đường dẫn này, Codefresh sẽ tạo hình ảnh Docker cho ứng dụng Php
Lưu ý rằng tất cả các phụ thuộc được tải xuống khi dockerfile được tạo
Khởi chạy hình ảnh Docker
Codefresh cũng có thể khởi chạy Docker image [sử dụng Docker swarm phía sau hậu trường]. Với mỗi tài khoản Codefresh, bạn có quyền truy cập vào một số môi trường Docker giới hạn có thể lưu trữ bất kỳ hình ảnh Docker hoặc tệp soạn thảo Docker nào
Trước tiên hãy tìm hình ảnh của bạn trong
Nhấp vào nút khởi chạy và một quy trình mới sẽ chạy để triển khai
Lưu ý rằng nhật ký đường ống hiển thị URL động của ứng dụng. Chỉ cần truy cập nó bằng trình duyệt của bạn và bạn sẽ thấy kết quả
Lưu ý rằng các môi trường này chỉ dành cho thử nghiệm và xem trước ứng dụng của bạn khi nó được phát triển. Chúng KHÔNG dành cho mục đích sản xuất
Mục đích của bài đăng này là để xem liệu có thể tránh cài đặt PHP trên các máy phát triển hay không. Để đạt được điều này, ý tưởng là tạo một lệnh PHP dựa trên bộ chứa docker
PHP và docker
PHP có thể được sử dụng với docker. Trong sản xuất, docker mang lại sự nhất quán với các ứng dụng khác được mã hóa bằng các ngôn ngữ khác nhau. Và điều này có thể đơn giản hóa rất nhiều việc triển khai của họ
Nhưng docker cũng có thể hữu ích trong môi trường phát triển. Không còn nghi ngờ gì nữa, khi có một nhà phát triển mới trong một dự án, docker sẽ giúp anh ta cài đặt tất cả các phụ thuộc cần thiết dễ dàng hơn rất nhiều. Đồng thời nó đảm bảo rằng môi trường là hoàn toàn giống nhau cho mọi người, trong quá trình phát triển cũng như trong sản xuất. Điều này có thể giúp bạn tránh xa những lỗi lạ
Có những hướng dẫn hay giải thích cách sử dụng docker-compose để định cấu hình dự án của bạn, như hướng dẫn này
Để sử dụng vùng chứa sản xuất trong quá trình phát triển, bạn chỉ cần tạo một ổ đĩa. Vì vậy, mã trên hệ thống của bạn sẽ thay thế mã bên trong vùng chứa. Bằng cách này, mã có thể được sửa đổi bên ngoài vùng chứa trong trình chỉnh sửa mã. Những thay đổi được phản ánh ngay lập tức. Và điều này hoạt động theo cả hai cách. Bạn có thể dùng docker exec để chạy một số lệnh trong container và nó sẽ ảnh hưởng đến code trên máy của bạn
Cho đến nay rất tốt, không cần cài đặt PHP bên ngoài docker cho trường hợp sử dụng này
Cần một lệnh PHP sau khi tất cả?
Tất cả điều này hoạt động tốt. Nhưng vẫn có trường hợp PHP cần thiết bên ngoài vùng chứa của ứng dụng
- Nếu bạn muốn sử dụng trình nói dối hoặc trình định dạng mã trong trình chỉnh sửa mã của mình, nó sẽ cần quyền truy cập vào PHP
- Tại một số điểm, bạn cũng có thể muốn chạy một số tập lệnh nhỏ không thuộc dự án
Đối với điều này, bạn vẫn cần PHP bên ngoài docker
Tạo một lệnh PHP
Vẫn có giải pháp tránh cài đặt PHP bên ngoài docker
Bạn có thể sử dụng
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php0 để tạo vùng chứa và thực thi PHP. Bạn chỉ cần thêm một số khối lượng vào thùng chứa. Các tập này phải bao gồm các đường dẫn đến mã của bạn
1
2
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
Lưu ý rằng điều này có thể được bao gồm trong một kịch bản
1
2
#!/bin/bash docker run -it --rm -v /home:/home -w $PWD php:cli php $@
Mà có thể được sử dụng như thế này.
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php1
Và bây giờ bạn có lệnh php của mình
Nó hoạt động nhưng nó làm tăng thời gian khởi động đến mức không thể sử dụng được trong trình chỉnh sửa mã. Ít nhất nếu trình định dạng mã của bạn được gọi mỗi khi bạn lưu tệp. Sự chậm trễ là do việc tạo vùng chứa. Vì vậy, có thể có một cách để giảm chi phí này
Bạn có thể tạo vùng chứa chạy ngầm. Thay vì thực thi tập lệnh, vùng chứa sẽ ngủ vô thời hạn. Sau đó, bạn có thể sử dụng docker exec để thực thi tập lệnh PHP trong vùng chứa
________số 8
# create a sleeping container docker run -d -i --name php_worker -v /home:/home php:cli bash -c "while true; do sleep 1; done;" # execute the php script docker exec -it -w $PWD php_worker php /home/my_script.php # remove the container docker kill php_worker && docker rm php_worker
Trên máy của tôi, tôi nhận được những kết quả này cho
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php2
Phiên bản
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php3 tiết kiệm vài mili giây so với
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php0. Nó không hoàn hảo nhưng nó đủ để làm cho nó có thể sử dụng được
Trong thực tế
Tạo vùng chứa và sau đó sử dụng docker exec không thực sự thiết thực. Vì vậy, tôi đã viết một tập lệnh python sử dụng ý tưởng này
Nó sử dụng
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php3 để chạy lệnh PHP. Trước khi chạy lệnh exec, nó sẽ kiểm tra xem bộ chứa PHP đang ngủ có tồn tại không. Nếu không, nó tạo ra nó. Vùng chứa này sẽ chạy trong một khoảng thời gian xác định, do đó, chi phí hoạt động do việc tạo vùng chứa này gây ra sẽ chỉ ảnh hưởng đến lệnh gọi đầu tiên. Nó cũng có thể ghi nhật ký để giúp gỡ lỗi các sự cố cuối cùng
Xin lưu ý rằng tập lệnh có thể cần tải xuống hình ảnh docker, vì vậy có thể mất thời gian trong lần gọi đầu tiên
version: '1.0'
steps:
main_clone:
title: Cloning main repository...
type: git-clone
repo: 'codefresh-contrib/php-composer-sample-app'
revision: master
git: github
MyAppDockerImage:
title: Building Docker Image
type: build
image_name: my-php-image
working_directory: ./
tag: master
dockerfile: Dockerfile
4version: '1.0'
steps:
main_clone:
title: Cloning main repository...
type: git-clone
repo: 'codefresh-contrib/php-composer-sample-app'
revision: master
git: github
MyAppDockerImage:
title: Building Docker Image
type: build
image_name: my-php-image
working_directory: ./
tag: master
dockerfile: Dockerfile
5Sao chép tập lệnh trong
# the current directory and the script directory should be included in the home directory for this to work docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php6 [hoặc bất kỳ đích nào khác có trong $PATH của bạn] và bạn có một lệnh PHP hoạt động với docker
1
2
version: '1.0'
steps:
main_clone:
title: Cloning main repository...
type: git-clone
repo: 'codefresh-contrib/php-composer-sample-app'
revision: master
git: github
MyAppDockerImage:
title: Building Docker Image
type: build
image_name: my-php-image
working_directory: ./
tag: master
dockerfile: Dockerfile
8Kịch bản có hai hạn chế
- Nó phải được gọi từ một thư mục được chia sẻ với bộ chứa docker
- Tập lệnh và các phần phụ thuộc của nó phải nằm trong các thư mục được chia sẻ với vùng chứa
Tại sao lại sử dụng cái này?
Với tập lệnh này, có thể tránh cài đặt PHP trên hệ thống của bạn. Nhưng sử dụng trình quản lý gói như apt vẫn là một lựa chọn tốt. Vì vậy, những lợi thế của giải pháp docker này là gì?
- Tùy thuộc vào kho lưu trữ trình quản lý gói của bạn, có thể mất thời gian để tải phiên bản PHP mới nhất. Mặt khác, các hình ảnh docker PHP chính thức được cập nhật thường xuyên. Vì vậy, bạn có thể có phiên bản mới nhất nhanh hơn
- Với tập lệnh này, bạn có thể chạy các phiên bản PHP khác nhau một cách dễ dàng. Bạn chỉ cần thay đổi tên của các hình ảnh trong kịch bản
- Bạn có thể tạo và sử dụng hình ảnh PHP của riêng mình với các phần mở rộng bổ sung. Chia sẻ hình ảnh với những người còn lại trong nhóm của bạn để họ có thể có cùng một môi trường
- Bạn cũng có thể sử dụng hình ảnh của một trong các dự án PHP của mình
Trong thực tế, có thể bạn sẽ muốn cài đặt PHP với trình quản lý gói. Nhưng tập lệnh này có thể là một bổ sung tốt cho các trường hợp sử dụng cụ thể
Các ứng dụng khác
Trong ví dụ này, tập lệnh được sử dụng cho PHP. Nhưng nó không bị giới hạn ở đó. Nó có thể được điều chỉnh để sử dụng với các ngôn ngữ kịch bản khác như Node. js hoặc ruby chẳng hạn. Bạn chỉ cần thay đổi thông số cấu hình