我遇到一个问题,我的PHP版本正在影响我试图在docker容器内运行的项目。
当我在容器中运行php -v
时,我得到了这个。
PHP 5.5.9-1ubuntu4.20 (cli) (built: Oct 3 2016 13:00:37)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
我的目标是让“php -v”命令结果如下所示。它现在在工作机器上发挥作用。
PHP 5.5.30 (cli) (built: Dec 12 2015 21:28:27)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
with Suhosin v0.9.36, Copyright (c) 2007-2014, by SektionEins GmbH
我需要降级的原因是,这两个版本之间的date()函数如何工作导致PDO Extention中出现崩溃错误,这一点有所改变(带有消息的异常'PDOException') 'SQLSTATE [22007]:日期时间格式无效:1292日期时间值不正确:'2017-01-13 23:47:31 UTC')
更改PHP版本似乎解决了这个问题。为了节省时间,因为它是一个庞大的项目,我需要将其部署到活动用户,我需要切换PHP版本。
我的泊坞窗文件如下所示。
FROM ubuntu:14.04
MAINTAINER Joe Astrahan <****>
VOLUME ["/var/www"]
RUN apt-get update && \
apt-get install -y software-properties-common && \
apt-get update && \
apt-get install -y \
apache2 \
curl \
libcurl3 \
libcurl3-dev \
php5 \
php5-cli \
libapache2-mod-php5 \
php5-gd \
php5-json \
php5-ldap \
php5-mysql \
php5-pgsql \
php5-curl
COPY config/apache_default.conf /etc/apache2/sites-available/000-default.conf
COPY config/run /usr/local/bin/run
RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite
EXPOSE 80
CMD ["/usr/local/bin/run"]
运行文件如下:
#!/bin/bash
set -e
PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL & ~E_DEPRECATED & ~E_NOTICE"}
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/apache2/php.ini
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/cli/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/apache2/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/cli/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/apache2/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/cli/php.ini
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND
我不知道如何安装特定版本的php 5.5.30 ,因为它总是安装5.9。我环顾谷歌,找不到任何东西。任何帮助表示赞赏!
如果下面需要我的docker-compose.yml文件。
version: '2'
services:
dblive:
image: mysql:5.7.17
volumes:
- ./db_data_live:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ****
MYSQL_DATABASE: ****
MYSQL_USER: ****
MYSQL_PASSWORD: ****
dbdev:
image: mysql:5.7.17
volumes:
- ./db_data_dev:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ****
MYSQL_DATABASE: ****
MYSQL_USER: ****
MYSQL_PASSWORD: ****
phpmyadmin:
depends_on:
- dblive
- dbdev
image: phpmyadmin/phpmyadmin
environment:
PMA_ARBITRARY : 1
restart: always
ports:
- "8081:80"
web:
build: ./
depends_on:
- dblive
- dbdev
volumes:
- ./web:/var/www
- ./config/php.ini:/usr/local/etc/php/php.ini
- ./config/apache_default.conf:/etc/apache2/sites-enabled/000-default.conf
restart: always
ports:
- "80:80"
- "443:443"
environment:
TEST: testenviromentvar
我模糊了密码,但只是自己设置数据库。注意,使用docker exec 8d8a115f6d6b php -v
来测试容器中的php版本。在运行docker-compose up之后,#s的混乱是容器ID ...
对于那些好奇的PHP中的行当前错误,它在下面。
$ class-&gt; created = date('Y-m-d H:i:s',time());
$ validated = $ class-&gt; save();
我得到了这个确切的错误消息,异常'PDOException',消息'SQLSTATE [22007]:无效的日期时间格式:1292不正确的日期时间值:'2017-01-13 23:47:31 UTC'用于“创建”列/var/www/public_html/devsite/vendor/php-activerecord/php-activerecord/lib/Connection.php:322中的第1行
错误是因为UTC,但由于某种原因,这不会导致5.5.30中的问题?
答案 0 :(得分:0)
感谢xn20c的帮助,我找到了解决方案。
首先让你的dockerfile看起来像这样。
FROM ubuntu:14.04
MAINTAINER Your Name <your@email.com>
VOLUME ["/var/www"]
RUN apt-get update && \
apt-get install -y software-properties-common && \
apt-get update && \
apt-get install -y \
apache2 \
curl \
libcurl3 \
libcurl3-dev \
php5 \
php5-cli \
libapache2-mod-php5 \
php5-gd \
php5-json \
php5-ldap \
php5-mysqlnd \
php5-pgsql \
php5-curl \
mysql-client
COPY config/php.ini /etc/php5/apache2/php.ini
# install php-5.5.30
COPY config/install_php-5.5.30.sh /tmp/install_php-5.5.30.sh
RUN /bin/bash /tmp/install_php-5.5.30.sh
COPY config/apache_default.conf /etc/apache2/sites-available/000-default.conf
COPY config/run /usr/local/bin/run
RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite
EXPOSE 80
CMD ["/usr/local/bin/run"]
接下来你会注意到它在最后寻找一个运行脚本,它还有一个特殊的脚本,可以从源代码安装php 5.5.30。
<强> install_php-5.5.30.sh 强>
#!/bin/bash
# install dependencies
apt-get -y update && \
apt-get install -y \
build-essential \
apache2-dev \
libxml2-dev
# download PHP 5.5.30 source code
cd /tmp
curl -fsSL http://php.net/get/php-5.5.30.tar.bz2/from/this/mirror | tar xjf -
cd php-5.5.30
# configure build options
./configure --prefix=/usr \
--with-config-file-path=/etc/php5/apache2 \
--with-config-file-scan-dir=/etc/php5/apache2/conf.d \
--disable-pdo \
--disable-json \
--enable-mbstring \
--with-apxs2
# compile and install
NUM_CORES=`cat /proc/cpuinfo | grep processor | wc -l`
make -j $NUM_CORES
make install
# configure extension directory
echo 'extension_dir="/usr/lib/php5/20121212"' >> /etc/php5/apache2/php.ini
# cleanup
rm -rf /tmp/php-5.5.30 /tmp/install_php-5.5.30.sh
以上安装PHP并使用--enable-mbstring启用mbstring模块。通常PHP默认安装此软件包,但是当您按源编译时,您必须启用它。这适用于您可能需要的任何其他软件包,只需查看--enable标志将是什么并将其添加到那里。
最后,我的运行脚本会对php.ini文件做一些最后一分钟的更改,我觉得这很好。
生成强>
#!/bin/bash
set -e
PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL & ~E_DEPRECATED & ~E_NOTICE"}
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/apache2/php.ini
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/cli/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/apache2/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/cli/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/apache2/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/cli/php.ini
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND
最后将这一切与像这样的docker-compose文件一起...
version: '2'
services:
dblive:
image: mysql:5.5.52
volumes:
- ./db_data_live:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ****
MYSQL_DATABASE: ****
MYSQL_USER: ****
MYSQL_PASSWORD: ****
dbdev:
image: mysql:5.5.52
volumes:
- ./db_data_dev:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ****
MYSQL_DATABASE: ****
MYSQL_USER: ****
MYSQL_PASSWORD: ****
phpmyadmin:
depends_on:
- dblive
- dbdev
image: phpmyadmin/phpmyadmin
environment:
PMA_ARBITRARY : 1
restart: always
ports:
- "8081:80"
web:
build: ./
depends_on:
- dblive
- dbdev
volumes:
- ./web:/var/www
- ./config/apache_default.conf:/etc/apache2/sites-enabled/000-default.conf
restart: always
ports:
- "80:80"
- "443:443"
然后只需运行... docker-compose up -d --remove-orphans
并将Dockerfile放在同一个目录中,你有一个完全正常工作的php 5.5.30服务器,支持MySQL(live和amp; dev数据库)甚至PHPMyAdmin,可以通过8081端口访问(localhost:8081)
希望这有助于某人!
- 重要的附注 -
确保您的php.ini文件不会更改extention_dir ,否则您将遇到CURL无法找到正确的扩展路径等问题...