【发布时间】:2018-08-16 22:26:09
【问题描述】:
我正在构建一个安装在本地机器 (mac) 上的 PhalconPHP 的 docker 容器,如下所示:
FROM php:7.2-apache
...
RUN git clone --depth=1 git://github.com/phalcon/cphalcon.git /cphalcon
WORKDIR /cphalcon/build
RUN ./install
RUN touch /usr/local/etc/php/conf.d/docker-php-ext-phalcon.ini \
&& echo "extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/phalcon.so" >> /usr/local/etc/php/conf.d/docker-php-ext-phalcon.ini
...
然后我使用以下方法构建它:
docker build -t {registry url}/images/php72/apache/mongo:phalcon-dev -f {filename} .
一旦构建完成,我就可以使用 docker-compose 部署到我的本地机器上,并且运行良好。
然后我会将它推送到我托管在 GitLab 上的私有 docker 注册表中:
docker push {registry uri}/images/php72/apache/mongo:phalcon-dev
但是当我将它拉到我的登台服务器(cent)并使用 docker-compose 部署它时:
docker pull {registry uri}/images/php72/apache/mongo:phalcon-dev
容器就像丢失了 Phalcon 安装一样。
我可以在容器中使用命令行并使用 Dockerfile 中的命令重建 Phalcon,一切正常。
我是否在构建、推送或拉取命令中遗漏了什么?
感谢任何帮助!
文件:
Dockerfile
FROM php:7.2-apache
RUN apt-get update && apt-get install -y \
libssl-dev \
unzip \
git
RUN apt-get install -y curl gnupg make g++ \
&& curl -sL https://deb.nodesource.com/setup_8.x | bash - \
&& apt-get install -y nodejs
RUN pecl install mongodb
RUN touch /usr/local/etc/php/conf.d/docker-php-ext-mongo.ini \
&& echo "extension=mongodb.so" >> /usr/local/etc/php/conf.d/docker-php-ext-mongo.ini
RUN git clone --depth=1 git://github.com/phalcon/cphalcon.git /cphalcon
WORKDIR /cphalcon/build
RUN ./install
RUN touch /usr/local/etc/php/conf.d/docker-php-ext-phalcon.ini \
&& echo "extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/phalcon.so" >> /usr/local/etc/php/conf.d/docker-php-ext-phalcon.ini
RUN a2enmod rewrite
RUN echo "\n \
<Directory /var/www/html>\n \
RewriteEngine on\n \
RewriteCond %{REQUEST_FILENAME} !-d\n \
RewriteCond %{REQUEST_FILENAME} !-f\n \
RewriteRule ^(.*)$ index.php?_url=/\$1 [QSA,L]\n \
</Directory>\n \
" >> /etc/apache2/apache2.conf
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php composer-setup.php \
&& mv composer.phar /usr/local/bin/composer \
&& php -r "unlink('composer-setup.php');"
RUN apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& apt-get purge -y --auto-remove
WORKDIR /var/www/html
Docker-Compose 文件:
version: "3"
networks:
proxy:
external: true
site:
external: true
services:
db:
container_name: {container name}
environment:
- MONGODB_ROOT_PASSWORD={password}
- MONGODB_DATABASE={database}
image: bitnami/mongodb:latest
networks:
- site
restart: "always"
volumes:
- ./db:/bitnami/mongodb
www:
container_name: {container name}
environment:
- VIRTUAL_HOST={hostname}
- VIRTUAL_PORT=80
image: {registry name}/images/php72/apache/mongo:phalcon-dev
networks:
- site
- proxy
restart: "always"
volumes:
- ./www:/var/www/html
【问题讨论】:
-
当你从镜像创建容器时,你没有
CMD或ENTRYPOINT命令来运行 PhalconPHP。它运行时什么也不做。我认为它可能在本地也不起作用。您是否以某种方式运行容器,然后在本地运行时显式启动该过程?请分享您的docker-compose文件。 -
我在上面的“文件”下添加了 Dockerfile 和 docker compose。我只是使用从PHP 图像继承的 CMD
-
我不是 PHP 开发人员,但我看不到 Phalcon 是从哪里开始的。
docker-compose文件看起来不错,但它同时“运行”db和www容器,并假设两者(我假设 MongoDB 确实如此)都有CMD或ENTRYPOINT语句来启动该过程。您的DOCKERFILE有RUN语句,它们希望将 Phalcon 构建/安装到映像中,但我希望在最后看到类似于ENTRYPOINT ['/run/phalconphp']的内容,但那里什么都没有。 -
Phalcon 是一个 c 扩展,在 PHP 中像模块一样加载,类似于 MongoDB 或 MySQL 模块。
-
所以就好像当我将图像推送到我的注册表时,它会丢失 Phalcon 模块的构建信息。我现在正在寻找是否可能是 Dockerfile 的 apt-clean 部分导致了这个问题