Композитор не устанавливает плагины WordPress через dockerfile

#docker-compose #composer-php #dockerfile

#docker-compose #композитор-php #dockerfile

Вопрос:

Я использую docker-compose для создания среды WordPress. Я планирую использовать composer для установки плагинов и тем, которые мне нужны. Когда я запускаю сборку docker-compose, все строится нормально и без проблем. Когда я запускаю docker-compose up, я вижу, что все мои контейнеры запущены, включая composer. Когда я перехожу к сборке WordPress, устанавливаются только темы и плагины по умолчанию. Мой вопрос в том, почему не устанавливаются мои плагины и темы. Чего мне не хватает?

Я попытался включить файлы, которые, по моему мнению, были актуальны

Файловая структура

 /
 config/
   /composer/
      Dockerfile
      composer.json
   /wordpress/Dockerfile
   /database/Dockerfile
   /phpmyadmin/Dockerfile

 dist/
   /wp-content/
      /themes/
      /plugins/
      /uploads/

docker-composer.yml
  

composer.json

 {
  "repositories":[
    {
        "type":"composer",
        "url":"https://wpackagist.org"
    }
  ],
  "require": {
    "wpackagist-plugin/akismet":"dev-trunk",
    "wpackagist-plugin/wordpress-seo":">=7.0.2",
    "wpackagist-theme/hueman":"*"
  }
}
  

Dockerfile Composer

 FROM composer/composer:php7

# Install composer
WORKDIR /var/www/html/wp-content

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

COPY composer.json /var/www/html/wp-content
# COPY composer.lock ./
RUN composer install --no-scripts --no-autoloader
# COPY ./ /var/www/
RUN composer dump-autoload --optimize
  

Dockerfile Wodrpess

 # start with the latest wordpress and php image
FROM wordpress:5.1.1-php7.3-apache

# Set our environment variables for logging into wordpress
ENV WORDPRESS_DB_HOST database:3306
ENV WORDPRESS_DB_USER username
ENV WORDPRESS_DB_PASSWORD password

# Expose a port to run on
EXPOSE 80
  

База данных Dockerfile

 # start with the mysql image
FROM mysql:5.7

# Set our environment varibales for logging into the DB
ENV MYSQL_ROOT_PASSWORD UKoBMndyEY
ENV MYSQL_DATABASE wordpress
ENV MYSQL_USER username
ENV MYSQL_PASSWORD password

# Copy the database table dependencies into our image DB
COPY  ./includes /docker-entrypoint-initdb.d

# Expose a port to run on
EXPOSE 3306:3306
  

docker-compose.yml

 version: "3.3"
services:
  wordpress:
    build:
      context: ./config/docker/wordpress
    volumes:
      - ./dist/wp-content:/var/www/html/wp-content
    ports:
      - "8080:80"
    restart: always
    working_dir: /var/www/html
    depends_on:
      - database
  database:
    build:
      context: ./config/docker/database
    volumes:
      - datab:/var/lib/mysql
    restart: always
  composer:
    build:
      context: ./config/docker/composer
    restart: 'no'
    image: "composer"
    volumes:
      - ./dist/wp-content:/var/www/html/wp-content
  phpmyadmin:
    build:
        context: ./config/docker/phpmyadmin
    ports:
      - 8181:80
    restart: always
    depends_on:
      - database
volumes:
    datab: {}
  

Комментарии:

1. Службе composer на самом деле не нужно запускать, поскольку она выполняет всю работу во время сборки. И во время сборки отображение временных объемов, которое вы выполняете в docker-compose, недоступно. Я предлагаю использовать многоступенчатую сборку для вашего сервиса WordPress: первым этапом должна быть часть compose (ваш compose dockerfile), а на втором этапе следует скопировать содержимое /var / www / html / wp-content в изображение WordPress и продолжить любую работу, которую вы выполняете в Dockerfile WordPress.

2. Привет @Mihai спасибо за ваш ответ. У вас есть пример того, как это может выглядеть? Я удалил службу composer из файла docker-compose. Сначала я запустил файл composer docker для установки composer, но я запутался во второй части относительно того, что я копирую. Спасибо за вашу помощь

3. Хорошо, можете ли вы опубликовать используемый вами Dockerfile WordPress?

4. Я обновил свой вопрос как с помощью WordPress, так и с помощью dockerfiles базы данных

Ответ №1:

Как объяснено в моем комментарии, вам нужно немного изменить свой проект.

Папка composer и служба могут исчезнуть. Переместите содержимое папки composer в папку WordPress.

Тогда Dockerfile в папке WordPress должен выглядеть следующим образом:

 FROM composer/composer:php7 as build

# Install composer
WORKDIR /var/www/html/wp-content

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

COPY composer.json /var/www/html/wp-content
# COPY composer.lock ./
RUN composer install --no-scripts --no-autoloader
# COPY ./ /var/www/
RUN composer dump-autoload --optimize

FROM wordpress:5.1.1-php7.3-apache

# Set our environment variables for logging into wordpress
ENV WORDPRESS_DB_HOST database:3306
ENV WORDPRESS_DB_USER username
ENV WORDPRESS_DB_PASSWORD password

COPY --from=build /var/www/html/wp-content /var/www/html/wp-content

# Expose a port to run on
EXPOSE 80
  

Теперь docker-compose.yml можно упростить следующим образом:

 version: "3.3"
services:
  wordpress:
    build:
      context: ./config/docker/wordpress
    ports:
      - "8080:80"
    restart: always
    working_dir: /var/www/html
    depends_on:
      - database
  database:
    build:
      context: ./config/docker/database
    volumes:
      - datab:/var/lib/mysql
    restart: always
  phpmyadmin:
    build:
        context: ./config/docker/phpmyadmin
    ports:
      - 8181:80
    restart: always
    depends_on:
      - database
volumes:
    datab: {}
  

Я надеюсь, что это работает для вас. В противном случае сообщите мне об ошибке, и я посмотрю на нее.

Комментарии:

1. Большое спасибо за пример. Это сработало для меня!