Docker compone php-fpm, nginx, mysql y usa wp-cli en nginx

6 minutos de lectura

avatar de usuario
Amit Rahav

I para vincular 3 contenedores separados juntos:

mi meta es ejecutar la instalación de wp-cli antes de que el código fuente se copie en el contenedor nginx.

problemas:

  1. intentar ejecutar el script de instalación de wp-cli desde Dockerfile (imagen de my-nginx) funciona bien, pero cuando intento ejecutar cualquier comando de wp-cli, devuelve un error: env: can't execute 'php': No such file or directory
  2. El script de instalación wp-cli (con las dependencias correctas) también funciona en dockerfile.php-fpm (imagen my-php), también devuelve un error: Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress install exists under. y me ofrece ejecutar este comando con la bandera –allow-root, lo cual es malo en este caso porque quiero usar los permisos de usuario de wp. o para ejecutar este comando como otro usuario.

configuraciones básicas

docker-compose.yml:

version: '2'
services:

my-nginx:
    build: .
    volumes:
      - .:/var/www/html
    ports:
      - "8080:80"
    links:
      - my-php
      - my-mysql
  my-php:
    build:
      context: .
      dockerfile: Dockerfile.php-fpm
    volumes:
      - .:/var/www/html
    ports:
      - "9000:9000"
  my-mysql:
    image: mariadb:5.5
    volumes:
      - /var/lib/mysql

nginx.conf:

server {
  server_name _;
  listen 80 default_server;

  root   /var/www/html;
  index  index.php index.html;

  access_log /dev/stdout;
  error_log /dev/stdout info;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ .php$ {
    include fastcgi_params;
    fastcgi_pass my-php:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

La integración de wp-cli se clona desde: https://github.com/conetix/docker-wordpress-wp-cli

Opción 1

Dokerfile:

FROM nginx:1.10-alpine

# add root dir
RUN mkdir -p /var/www/html
WORKDIR /var/www/html
ENV WP_ROOT /var/www/html

# Install requirements for wp-cli support
RUN apk update \
  && apk add less mysql-client sudo curl


# copy nginx configuration
COPY nginx.conf /etc/nginx/conf.d/default.conf


# Add WP-CLI 
RUN curl -o /bin/wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
COPY wp-su.sh /bin/wp
RUN chmod +x /bin/wp-cli.phar \
    && sudo mv /bin/wp-cli.phar /usr/local/bin/wp

RUN  wp core download --allow-root

# copy all files for current dir (should be theme or plugin folder)
COPY . ./

Dockergile.php-fpm

FROM php:7.0.6-fpm-alpine  

VOLUME /var/www/html
RUN docker-php-ext-install -j $(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1)  iconv gd mbstring fileinfo curl xmlreader xmlwriter mysqli

opcion 2

Dokerfile:

FROM nginx:1.10-alpine

# add root dir
RUN mkdir -p /var/www/html
WORKDIR /var/www/html

RUN apk update \
  && apk add less mysql-client sudo


# copy nginx configuration
COPY nginx.conf /etc/nginx/conf.d/default.conf


# copy all files for current dir (should be theme or plugin folder)
COPY . ./

Dockergile.php-fpm

FROM php:7.0.6-fpm-alpine  

VOLUME /var/www/html
RUN docker-php-ext-install -j $(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1)  iconv gd mbstring fileinfo curl xmlreader xmlwriter mysqli

# Install requirements for wp-cli support
RUN apk update \
    && apk add curl sudo less
ENV WP_ROOT /var/www/html

# Add WP-CLI 
RUN curl -o /bin/wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
COPY wp-su.sh /bin/wp
RUN chmod +x /bin/wp-cli.phar \
    && sudo mv /bin/wp-cli.phar /usr/local/bin/wp

RUN  wp core download

preguntas generales:

  1. ¿Cuál es la mejor práctica para los permisos de los usuarios dentro de los acopladores?
  2. wp-cli integración desde https://github.com/conetix/docker-wordpress-wp-cli/blob/master/wp-su.sh utiliza el usuario www-data: ¿debería agregar este usuario a mi ventana acoplable y, de ser así, a cuál? ngnix o php-fpm y por qué.
  3. ejecutando wp donlowd core desde el contenedor php-fpm aparece como si descargara los archivos, pero cuando intento ejecutar cuando se está ejecutando, ninguno de estos archivos se muestra en /var/www/html. ¿Hay alguna manera de ordenar el montaje de archivos de imágenes?
  4. ¿Por qué ‘php’ no está disponible en el comando my-nginx si volumen
    mi imagen-php? ¿Debo instalar php también en esta imagen?

PHP no está instalado en su contenedor nginx. Yo diría que tampoco debería instalarse allí. Use su contenedor php fpm para ejecutar WP CLI. Así es como ejecuto WP CLI usando una configuración similar:

docker-compose.yml:

version: '2'
services:
  mysql:
    image: mysql:latest
    volumes:
      - "../.data/db:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: my_database
      MYSQL_USER: my_user
      MYSQL_PASSWORD: password
  phpfpm:
    depends_on:
      - mysql
    image: my/phpfpm:latest
    build: ./docker/php-fpm
    volumes:
      - ".:/var/www/html"
      - "./docker/php-fpm/php.ini:/usr/local/etc/php/php.ini"
      - "./docker/php-fpm/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini"
    links:
      - mysql
    restart: always
    extra_hosts:
      - "mysite.dev:172.18.0.1" # Use the gateway address for your docker network for the ip address. This is so that PHP FPM can find nginx for the postback to do things like cron jobs with WordPress
  nginx:
    depends_on:
      - phpfpm
    ports:
      - "80:80"
    image: nginx:latest
    volumes:
      - ".:/var/www/html"
      - "./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf"
    links:
      - phpfpm
    restart: always

ventana acoplable/php-fpm/Dockerfile:

FROM php:5.5-fpm

ARG INSTALL_XDEBUG=true
ENV INSTALL_XDEBUG ${INSTALL_XDEBUG}
RUN if [ ${INSTALL_XDEBUG} = true ]; then \
    pecl install xdebug && \
    docker-php-ext-enable xdebug \
;fi

RUN apt-get update && apt-get install -y libz-dev libmemcached-dev libjpeg-dev libpng-dev \
    && pecl install memcached \
    && docker-php-ext-enable memcached \
    && docker-php-ext-install -j$(nproc) pdo pdo_mysql mysqli gd \
    && docker-php-ext-enable pdo pdo_mysql mysqli gd

RUN docker-php-ext-install zip \
    && docker-php-ext-enable zip

RUN curl https://getcomposer.org/download/1.2.0/composer.phar > /tmp/composer.phar \
    && chmod +x /tmp/composer.phar \
    && mv /tmp/composer.phar /usr/local/bin/composer \
    && apt-get update && apt-get install -y less \
    && curl https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar > /tmp/wp-cli.phar \
    && chmod +x /tmp/wp-cli.phar \
    && mv /tmp/wp-cli.phar /usr/local/bin/wp

CMD ["php-fpm"]

EXPOSE 9000

También uso un contenedor memcached, por eso el dockerfile también está instalando la extensión memcached. Las partes importantes son donde instala WP CLI y lo mueve a su lugar. También puede modificar la versión de PHP que está instalada cambiándola en ese dockerfile. Una vez que tenga su clúster en funcionamiento con WP CLI instalado en PHP, puede ejecutar el siguiente comando para ejecutar los comandos wp cli dentro del contenedor:

docker exec -u www-data <container_name> wp ... # whatever command after that

Tengo alias para diferentes proyectos que ya tienen los nombres de los contenedores:

alias mywp="docker exec -u www-data mysite_phpfpm_1 wp"

y eso me permite ejecutar comandos wp como este:

mywp core update-db --network
mywp post meta list 2119

  • donde se define el usuario www-data?

    – Amit Rahav

    26/09/2016 a las 22:39

  • Simplemente existe en el cuadro PHP FPM. La caja de PHP lo tiene definido de antemano como el usuario que ejecuta los procesos fpm.

    – John P Bloch

    27/09/2016 a las 15:48

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad