PHP extension sockets is missing
在使用 [composer](https://hub.docker.com/_/composer)
當作 container 去安裝 Laravel 專案時,line/line-bot-sdk-php 套件 需要 PHP extension sockets
套件,而我們如果有需要額外的 extension 的時候,則需要在這些 container 安裝這些套件才可以正常使用 composer 進行安裝
+ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for linecorp/line-bot-sdk 3.13.0 -> satisfiable by linecorp/line-bot-sdk[3.13.0].
- linecorp/line-bot-sdk 3.13.0 requires ext-sockets * -> the requested PHP extension sockets is missing from your system.
To enable extensions, verify that they are enabled in your .ini files:
- /usr/local/etc/php/php-cli.ini
- /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
- /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
- /usr/local/etc/php/conf.d/docker-php-ext-zip.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
建立自己的 container
若自己的專案所需要的系統套件沒有的話,可以基於線上的 container 版本,自己再去額外安裝自己需要的套件,之後在部署安裝檔案時,也可以依照我們所需要的環境去建置
php - Docker Hub預設會安裝以下的套件,可以使用 php -m
去看看現在有安裝的套件有哪些
$ php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
gd
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
[Zend Modules]
根據php - Docker Hub的文件說明,可以使用 docker-php-ext-install
指定要額外安裝哪些套件
所以可以使用這個指令,基於 php:7
這個 container 額外去安裝 socket 套件
若要安裝其他套件也可以使用
docker-php-ext-install
指令接著安裝,我們這邊需要 zip 及 gd 套件的話,就可以接著指定要求安裝此套件
FROM php:7
RUN docker-php-ext-install sockets \
&& docker-php-ext-install zip \
&& docker-php-ext-install gd
然後因為除了 php,我們還需要 Composer
,所以根據 Compser 官方網站的安裝流程,在套件安裝完成後,使用下列指令安裝 Composer
# Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer
所以根據以上的需求,整個 php 套件安裝環境的 Dockerfile
會長的像這樣
FROM php:7
# 更新套件
RUN apt-get update -y && apt-get install -y \
zlib1g-dev \
libpng-dev \
unzip \
libzip-dev
# 安裝 php 套件
RUN docker-php-ext-install sockets \
&& docker-php-ext-install zip \
&& docker-php-ext-install gd
# Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer
接著進入 Dockerfile
的目錄,建立該 container 即可
docker build -t kejyun/php7-composer:0.0.4 .
推送自訂 container 至 docker hub
建立完映像檔後,即可將我們剛剛建立的映像檔版本推送至 docker hub
docker push kejyun/php7-composer:0.0.4
Drone 使用自訂映像檔
在 .drone.yml
檔案中,指定 composer 使用我們自建的映像檔即可正常運行了
- name: install-branch
image: kejyun/php7-composer:0.0.4
commands:
- composer install
depends_on:
- git-branch
when:
event:
include:
- push
branch:
include:
- stage
- develop