Сборка php на компиляторе, и запустить его в alpine не удалось - PullRequest
1 голос
/ 25 апреля 2019

Я пытался собрать php7 с помощью следующей команды:

./configure --prefix=/root/testphp --with-openssl --enable-zip --enable-mbstring --with-pdo-mysql --enable-static
make
make install

И затем я пытаюсь запустить его на компилируемом компьютере, он работал так:

[root@guningvm ~]# /root/testphp/bin/php -v
PHP 7.3.4 (cli) (built: Apr  8 2019 11:25:09) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies

Нокогда я монтирую dir /root/testphp в контейнер для альпийского докера:

docker run -itd --name "testforphp" -v /root/testphp/:/usr/local/php/ alpine:3.7

и запускаю команду php в контейнере с /usr/local/php/bin/php -v, это неправильно с sh: /usr/local/php/bin/php: not found

Может кто-нибудьскажите мне, почему это не сработало? Я потратил много времени на эту проблему. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Это не совсем понятно, но, похоже, вы собираете PHP на своем локальном компьютере с Linux (скажем, Ubuntu) и пытаетесь запустить его на контейнере Alpine.

Я также предполагаю, что у вас есть веские причины для сборки PHP из исходного кода - в противном случае вы можете использовать доступные сборки PHP для Alpine .

Сборка на не-Alpine Linux и запуск получившегося исполняемого файла на Alpine обычно не работают, поскольку Alpine Linux использует специальную реализацию libc (Standard C library), которая называется musl libc . musl не совместим с библиотекой GNU C - glibc , используемой большинством других дистрибутивов Linux, поэтому для запуска нативного программного обеспечения в Alpine Linux его необходимо создавать на основе той же библиотеки musl libc.

Сообщение об ошибке /usr/local/php/bin/php: not found приводит в замешательство, и, если предположить, что файл присутствует, это может быть результатом сбоя динамического связывания. Вы можете проверить это, используя ldd /usr/local/php/bin/php.

Следовательно, вам придется связать PHP с библиотекой musl C для работы на Alpine и, что наиболее предпочтительно, на машине Alpine.

Я могу представить следующие варианты:

  1. Сборка PHP на альпийском контейнере. Я не уверен, поддерживает ли это основная ветка разработки PHP (например, поддержка OpenJDK Java Alpine разработана в рамках отдельных проектов, называемых IcedTea и Portola), но это стоит попробовать. Я полагаю, что это возможно, поскольку сборки PHP доступны для Alpine - попробуйте следовать их рецепту build , если у вас возникнут трудности. Это лучший вариант, на мой взгляд.

  2. Продолжайте собирать PHP на своем компьютере, отличном от Alpine Linux, но связывайте его с бинарным файлом musl libc (обычно доступным через пакеты), а не с glibc. Это может быть более трудным для достижения и более подверженным проблемам, поэтому менее рекомендуется.

  3. Запустите ваш встроенный PHP на контейнере Alpine с поддержкой glibc. Это довольно простая процедура. Однако этот вариант, вероятно, не является жизнеспособным, поскольку ваш PHP по-прежнему будет несовместим с vanilla Alpine и не может использоваться пользователями PHP Alpine «из коробки». Кроме того, добавление glibc в контейнер приводит к накладным расходам в несколько МБ, что противоречит вашей цели при минимальном размере.

0 голосов
/ 06 мая 2019

Ответ адвокат дьяволов:

Если ваш хост-компьютер был, скажем, fedora 30, а ваш контейнер был основан на изображении fedora 30, это бы работало нормально.

Но опять же, мы вернемся к моему первоначальному комментарию о том, что мы не так используем контейнеры.

...