Lev*_*osa 4 php docker alpine-linux
我刚刚开始使用 Docker,我正在尝试使用 php:7.4-alpine 映像运行 ZF2 项目,这是我当前拥有的 Dockerfile
FROM php:7.4-alpine
ENV APACHE_DOCUMENT_ROOT /var/www/app/public
COPY ./src /var/www/app
RUN apk add --no-cache \
apache2 \
php-apache2 \
zlib-dev \
icu-dev \
libpng-dev \
composer
RUN docker-php-ext-install \
gd \
intl \
mysqli \
pdo_mysql \
iconv
RUN chmod -R 775 /var/www/app
RUN chown -R www-data:www-data /var/www/app
RUN cd /var/www/app && composer install
COPY ./apache /etc/apache2
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
Run Code Online (Sandbox Code Playgroud)
(我使用多个 RUN 只是为了在构建时加快速度,我将在生产中更改它)
问题是,我只收到 500 错误,日志显示了这一点
PHP Fatal error: Uncaught Error: Class 'Locale' not found in /var/www/...
Run Code Online (Sandbox Code Playgroud)
从我谷歌搜索到的,这与 intl 扩展有关,正如你所看到的,我将它安装在 Dockerfile 中,如果我在容器的 shell 中运行 php -m,intl 就在那里,但是,在一个简单的例子中我设置的 ext.php 文件,内容如下:
FROM php:7.4-alpine
ENV APACHE_DOCUMENT_ROOT /var/www/app/public
COPY ./src /var/www/app
RUN apk add --no-cache \
apache2 \
php-apache2 \
zlib-dev \
icu-dev \
libpng-dev \
composer
RUN docker-php-ext-install \
gd \
intl \
mysqli \
pdo_mysql \
iconv
RUN chmod -R 775 /var/www/app
RUN chown -R www-data:www-data /var/www/app
RUN cd /var/www/app && composer install
COPY ./apache /etc/apache2
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
array(18) {
[0]=>
string(4) "Core"
[1]=>
string(4) "date"
[2]=>
string(6) "libxml"
[3]=>
string(4) "pcre"
[4]=>
string(4) "zlib"
[5]=>
string(6) "filter"
[6]=>
string(4) "hash"
[7]=>
string(10) "Reflection"
[8]=>
string(3) "SPL"
[9]=>
string(8) "standard"
[10]=>
string(14) "apache2handler"
[11]=>
string(4) "curl"
[12]=>
string(5) "iconv"
[13]=>
string(4) "json"
[14]=>
string(8) "mbstring"
[15]=>
string(7) "openssl"
[16]=>
string(3) "zip"
[17]=>
string(4) "Phar"
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,intl不在这里
之前当我使用 mlocati/docker-php-extension-installer 时,intl 没有任何问题,但是我在使用 iconv 时遇到了问题,所以我回到了“vanilla”docker-php-ext-install
我在安装docker-php-ext-configure intl前和docker-php-ext enable intl安装后都尝试过使用,没有任何变化。
那么让我们从以下开始:
$ docker run --rm -it php:7.4-alpine -r 'var_dump($l = new Locale("en_CA"));'
Fatal error: Uncaught Error: Class 'Locale' not found in Command line code:1
Stack trace:
#0 {main}
thrown in Command line code on line 1
Run Code Online (Sandbox Code Playgroud)
是的,有轨迹。那么:
FROM php:7.4-alpine
RUN apk add icu-dev
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
RUN docker-php-ext-enable intl
Run Code Online (Sandbox Code Playgroud)
和:
$ docker build -t php:intl-test ./
Run Code Online (Sandbox Code Playgroud)
最后:
$ docker run --rm -it php:intl-test -r 'var_dump($l = new Locale("en_CA"));'
object(Locale)#1 (0) {
}
Run Code Online (Sandbox Code Playgroud)
所以要么它有效,要么你有一个完全不同的问题。
这是我得到的输出docker-php-ext-install intl:
configure: error: Package requirements (icu-uc >= 50.1 icu-io icu-i18n) were not met:
Package 'icu-uc', required by 'virtual:world', not found
Package 'icu-io', required by 'virtual:world', not found
Package 'icu-i18n', required by 'virtual:world', not found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables ICU_CFLAGS
and ICU_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案就是添加icu-dev到已安装的软件包中。
更新以回答原始问题:
似乎docker-php-ext-install不能很好地处理转义换行符。我现在没有时间去研究这是为什么。将所有分机放在一根线上应该可行。
如果您对我对此类问题的调试过程感兴趣,我会运行类似的内容docker run --rm -ti --entrypoint sh php:7.4-alpine,然后直接运行命令。
| 归档时间: |
|
| 查看次数: |
15067 次 |
| 最近记录: |