Я создаю контейнер докеров с PhalconPHP, установленным на моем локальном компьютере (Mac), следующим образом:
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 push {registry uri}/images/php72/apache/mongo:phalcon-dev
Но когда я вытаскиваю его на свой промежуточный сервер (цент) и развертываю его с помощью docker-compose как такового:
docker pull {registry uri}/images/php72/apache/mongo:phalcon-dev
Контейнер действует так, как будто он потерял установку Phalcon.
Я могу ввести в контейнер командную строку и перестроить Phalcon, используя команды из Dockerfile, и все будет работать как надо.
Мне что-то не хватает в команде build, push или pull?
Любая помощь приветствуется!
Файлы:
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
Я добавил и Dockerfile, и docker compose в разделе «Файлы» выше. Я просто использую CMD, унаследованный от изображения PHP
Я не разработчик PHP, но не вижу, где запущен Phalcon. Файл docker-compose выглядит нормально, но он «запускает» контейнеры db и www и предполагает, что оба (я предполагаю, что у MongoDB есть) имеют операторы CMD или ENTRYPOINT для запуска процесса. В вашем DOCKERFILE есть операторы RUN, которые предназначены для сборки / установки Phalcon в образ, но я бы ожидал увидеть что-то вроде ENTRYPOINT ['/run/phalconphp'] в конце, а там ничего нет.
Phalcon - это c-расширение, которое загружается как модуль в PHP, аналогично модулю MongoDB или MySQL.
Таким образом, когда я помещаю образ в свой реестр, он теряет информацию о сборке для модуля Phalcon. Я ищу прямо сейчас, чтобы увидеть, может ли это быть раздел apt-clean в Dockerfile, вызывающий эту проблему.


Я также использую Phalcon с докером, мой образ докера основан на Debian 9, но работает отлично.
См. Мой файл докеров:
FROM debian:9
RUN apt-get update
RUN apt-get install -y \
apt-transport-https \
lsb-release \
ca-certificates \
wget \
curl \
nano \
dialog \
net-tools \
openssl
RUN apt-get install -y nginx
RUN wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
RUN sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
RUN apt-get update && apt-get install -y \
php7.1 \
php7.1-cli \
php7.1-fpm \
php7.1-mysql \
php7.1-curl \
php7.1-mbstring \
php7.1-gettext \
php7.1-gd \
php7.1-fileinfo \
php7.1-json \
php7.1-mcrypt \
php7.1-redis \
php7.1-intl \
php7.1-xml \
php7.1-zip
RUN curl -s "https://packagecloud.io/install/repositories/phalcon/stable/script.deb.sh" | bash
RUN apt-get install -y php7.1-phalcon
ADD entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod a+x /usr/bin/entrypoint.sh
ENTRYPOINT [ "entrypoint.sh" ]
Мой entrypoint.sh:
#!/bin/bash
service nginx start
service php7.1-fpm start
tail -F -n0 /etc/hosts
Надеюсь, это поможет тебе.
У вас нет команды
CMDилиENTRYPOINT, которая запускала бы PhalconPHP при создании контейнера из образа. Когда он запущен, он ничего не сделает. Я думаю, что это, наверное, тоже не работает локально. Вы каким-то образом запускаете контейнер, а затем запускаете процесс явно, когда запускаете его локально? Пожалуйста, поделитесь своим файломdocker-compose.