Docker php安裝擴展步驟詳解


前言

此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 這四個命令到底是用來干嘛的,它們在PHP容器中都做了哪些事情。
很多人很不理解在Dockerfile中安裝PHP擴展的時候總是出現這幾個命令,本篇就就是為你揭開這些命令的神秘面紗而准備的,所有案例都是本人自己運行過的。

Docker 中的PHP容器安裝擴展的方式有
  1. 通過pecl方式安裝
  2. 通過php 容器中自帶的幾個特殊命令來安裝,這些特殊命令可以在Dockerfile中的RUN命令中進行使用。

這里,我們主要討論的是第二種方案,如何通過PHP容器中的幾個特殊命令來安裝PHP擴展

PHP中安裝擴展有幾個特殊的命令

  • docker-php-source
  • docker-php-ext-install
  • docker-php-ext-enable
  • docker-php-ext-configure

演示這三個命令的作用

都是在PHP容器中進行演示的,PHP容器啟動太簡單,不作過多介紹

docker-php-source

此命令,實際上就是在PHP容器中創建一個/usr/src/php的目錄,里面放了一些自帶的文件而已。我們就把它當作一個從互聯網中下載下來的PHP擴展源碼的存放目錄即可。事實上,所有PHP擴展源碼擴展存放的路徑: /usr/src/php/ext 里面。

格式

docker-php-source extract | delete

參數說明
* extract : 創建並初始化 /usr/src/php目錄
* delete : 刪除 /usr/src/php目錄

案例

root@803cbcf702a4:/usr/src# ls -l
total 11896 #此時,並沒有php目錄
-rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
-rw-r--r-- 1 root root      801 Jun 28 03:23 php.tar.xz.asc

root@803cbcf702a4:/usr/src# docker-php-source extract
root@803cbcf702a4:/usr/src# ls -l
total 11900 #此時,生產了php目錄,里面還有一些文件,由於篇幅問題,就不進去查看了
drwxr-xr-x 14 root root     4096 Aug  9 09:01 php
-rw-r--r--  1 root root 12176404 Jun 28 03:23 php.tar.xz
-rw-r--r--  1 root root      801 Jun 28 03:23 php.tar.xz.asc

root@803cbcf702a4:/usr/src# docker-php-source delete
root@803cbcf702a4:/usr/src# ls -l
total 11896 #此時,將已創建 php 目錄給刪除了
-rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz
-rw-r--r-- 1 root root      801 Jun 28 03:23 php.tar.xz.asc

root@803cbcf702a4:/usr/src#

docker-php-ext-enable

這個命令,就是用來啟動 PHP擴展 的。我們使用pecl安裝PHP擴展的時候,默認是沒有啟動這個擴展的,如果想要使用這個擴展必須要在php.ini這個配置文件中去配置一下才能使用這個PHP擴展。而 docker-php-ext-enable 這個命令則是自動給我們來啟動PHP擴展的,不需要你去php.ini這個配置文件中去配置。
案例

# 查看現有可以啟動的擴展
root@517b9c67507a:/usr/local/etc/php# ls /usr/local/lib/php/extensions/no-debug-non-zts-20170718/
opcache.so  redis.so  sodium.so
root@517b9c67507a:/usr/local/etc/php#

# 查看redis 擴展是否可以啟動
root@517b9c67507a:/usr/local/etc/php# php -m | grep redis
root@517b9c67507a:/usr/local/etc/php#

# 啟動 redis 擴展
root@517b9c67507a:/usr/local/etc/php# docker-php-ext-enable redis
# 啟動 成功
root@517b9c67507a:/usr/local/etc/php# php -m | grep redis
redis
root@517b9c67507a:/usr/local/etc/php#

#說明,php容器中默認是沒有php.ini配置文件的,加載原理如下所示

root@517b9c67507a:/usr/local/etc/php# php -i | grep -A 5 php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => (none)
# 核心是 /usr/local/etc/php/conf.d 目錄下的擴展配置文件
Scan this dir for additional .ini files => /usr/local/etc/php/conf.d
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-redis.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini

root@517b9c67507a:/usr/local/etc/php#

docker-php-ext-install

這個命令,是用來安裝並啟動PHP擴展的。
命令格式:
docker-php-ext-install “源碼包目錄名”

注意點:

  • “源碼包“需要放在 /usr/src/php/ext 下
  • 默認情況下,PHP容器沒有 /usr/src/php這個目錄,需要使用 docker-php-source extract來生成。
  • docker-php-ext-install 安裝的擴展在安裝完成后,會自動調用docker-php-ext-enable來啟動安裝的擴展。
  • 卸載擴展,直接刪除/usr/local/etc/php/conf.d 對應的配置文件即可。

案例

# 卸載redis 擴展
root@803cbcf702a4:/usr/local# rm -rf /usr/local/etc/php/conf.d/docker-php-ext-redis.ini
root@803cbcf702a4:/usr/local# php -m 
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

root@803cbcf702a4:/usr/local#

#PHP容器默認是沒有redis擴展的。所以我們通過docker-php-ext-install安裝redis擴展

root@803cbcf702a4:/# curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2

root@803cbcf702a4:/# cd /tmp
root@517b9c67507a:/tmp# tar -xzf reids.tar.gz
root@517b9c67507a:/tmp# ls
phpredis-5.0.2  reids.tar.gz
root@517b9c67507a:/tmp# docker-php-source extract
root@517b9c67507a:/tmp# mv phpredis-5.0.2 /usr/src/php/ext/phpredis

#檢查移過去的插件源碼包是否存在
root@517b9c67507a:/tmp# ls -l /usr/src/php/ext | grep redis
drwxrwxr-x  6 root root 4096 Jul 29 15:04 phpredis
root@517b9c67507a:/tmp# docker-php-ext-install phpredis

# 檢查redis 擴展是否已經安裝上
root@517b9c67507a:/tmp# php -m | grep redis
redis
root@517b9c67507a:/tmp#

docker-php-ext-configure

docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,當你安裝擴展的時候,需要自定義配置時,就可以使用它來幫你做到。

案例

FROM php:7.1-fpm
RUN apt-get update \
    # 相關依賴必須手動安裝
    && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
    # 安裝擴展
    && docker-php-ext-install -j$(nproc) iconv mcrypt \
    # 如果安裝的擴展需要自定義配置時
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

原文:https://www.cnblogs.com/yinguohai/p/11329273.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM