Получите composer (менеджер зависимостей php) для запуска на сборке образа докера

ПРИМЕЧАНИЕ. Я больше не использую эту среду, поэтому у меня нет возможности проверить ответы и принять их. Мне жаль.

TL; DR Можете ли вы указать мне на пример образа докера, который использует composer для обработки зависимостей PHP?

Все мои вопросы в этом посте касаются составить инструмент зависимости php не докер-композитор преемник инжир.

Я пытаюсь создать свой собственный образ докера для запуска WordPress установлен как зависимость композитора.

Я работаю над созданием образа docker, используя в качестве основы php-изображение docker, и мне нужно установить composer и запустить команду обновления composer либо во время создания образа, либо во время сборки образа (не знаю, будут ли оба Хорошо).

Я могу запустить все отлично, вручную выполнив все шаги (запуск образа докера, вставка в него, копирование и вставка каждого шага).

Но когда я помещаю все эти шаги в Dockerfile, я не получаю композитора для записи файлов.

Я пытался получить минимальный неудачный пример в течение некоторого времени, но тот, который я получил, совсем не миниум.

Мой тест состоит из следующего (ссылки на соответствующие репозитории github ниже)

Dockerfile

NFORMATION ~~~#

# based on
# https://hub.docker.com/r/richarvey/nginx-php-fpm/
# and
# https://hub.docker.com/_/wordpress/

FROM php:7.0.2-apache

MAINTAINER Miquel Adell <[email protected]>

ENV WORDPRESS_VERSION 4.4.1#~~~ DEPENDENCIES ~~~#

# Add PHP repository to apt source
RUN apt-get update \
&& apt-get install -y \
libpng12-dev \
libjpeg-dev  \
curl \
sed \
zlib1g-dev \
&& docker-php-ext-install \
zip \
mysqli

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer#~~~ DIRS ~~~#

WORKDIR /var/www/html/#~~~ WORDPRESS ~~~#

COPY files/composer.json composer.json
ONBUILD RUN composer update

докер-compose.yml

wordpress:
image: miqueladell/composed_wordpress_test
links:
- wordpress_db:mysql
environment:
- VIRTUAL_HOST=miqueladell.dev
- WORDPRESS_DB_NAME=wordpress
ports:
- "80"
wordpress_db:
image: miqueladell/mariadb-utf8mb4
environment:
- MYSQL_ROOT_PASSWORD=password

Мой тест выглядит следующим образом

  1. Создайте образ, выполняющий эту команду, в каталоге, содержащем вставленный выше Dockerfile

    docker build -t miqueladell/composed_wordpress_test .
    

    (нет ошибок в журнале)

  2. Используйте этот образ для построения контейнера, выполнив следующую команду в каталоге, содержащем вставленный выше файл docker-compose.yml

    docker-compose up
    

    (нет ошибок в журнале)

  3. bash в работающий контейнер, чтобы увидеть, есть ли там файлы

    docker exec -i -t miqueladellv2_wordpress_1 bash
    
  4. ls of / var / www / html

    root@bff14367658b:/var/www/html# ls -al
    total 12
    drwxr-xr-x 2 www-data www-data 4096 Jan 19 10:50 .
    drwxr-xr-x 5 root     root     4096 Jan 19 10:50 ..
    -rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
    

Вы можете увидеть на шаге 4, что обновление композитора кажется, не побежал вообще.

Я пытался использовать оба

RUN composer update

а также

ONBUILD RUN composer update

на Dockerfile с такими же результатами.

Если я вернусь к предыдущему шагу 4 теста, и я вручную запустить обновление композитора в приглашении bash контейнера docker я получаю:

root@bff14367658b:/var/www/html# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing johnpbloch/wordpress-core-installer (0.2.1)
Downloading: 100%

- Installing johnpbloch/wordpress (4.4.1)
Downloading: 100%

Writing lock file
Generating autoload files
root@bff14367658b:/var/www/html# ls -al
total 24
drwxr-xr-x 4 www-data www-data 4096 Jan 19 11:12 .
drwxr-xr-x 6 root     root     4096 Jan 19 11:12 ..
-rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
-rw-r--r-- 1 root     root     3718 Jan 19 11:12 composer.lock
drwxr-xr-x 4 root     root     4096 Jan 19 11:12 vendor
drwxr-xr-x 5 root     root     4096 Jan 19 11:12 wordpress
root@bff14367658b:/var/www/html#

какой именно вывод я ожидал на шаге 4

Я хотел бы получить несколько советов. Благодарю.

github ссылки на полные файлы

29

Решение

Установка composer как это позволит избежать этой проблемы:

RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
# Make sure we're installing what we think we're installing!
&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot \
&& rm -f /tmp/composer-setup.*
19

Другие решения

Я столкнулся с этой проблемой сегодня.

Для меня это решило использовать каталог, отличный от того, который был определен на картинке.

Кажется, что изменения, внесенные в каталог во время процесса сборки, отбрасываются, если каталог определен как том.

Вот пример моего рабочего Dockerfile

FROM richarvey/nginx-php-fpm

# Install dependencies
RUN apt-get update && \
apt-get install curl nano && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add update nginx config
COPY conf/nginx-site.conf /etc/nginx/sites-available/default.conf

# Bundle app source
COPY app/ /app

# Install app dependencies
RUN cd /app && \
composer install --no-interaction

EXPOSE 80

А потом в conf/nginx-site.conf Я обновил рут для своего приложения (сокращен для краткости)

server {
# ... the rest of your nginx config

root /app/public;

# ... the rest of your nginx config
}
18

По вопросам рекламы [email protected]