【问题标题】:Docker compose php-fpm, nginx, mysql and use wp-cli on nginxDocker 编写 php-fpm、nginx、mysql 并在 nginx 上使用 wp-cli
【发布时间】:2017-02-02 08:05:13
【问题描述】:

我将 3 个单独的容器链接在一起:

我的目标是在将源代码复制到 nginx 容器之前运行 wp-cli 安装。

问题:

  1. 尝试从 Dockerfile(my-nginx 映像)运行 wp-cli 的安装脚本工作正常,但是当我尝试运行任何 wp-cli 命令时,它返回错误:env: can't execute 'php': No such file or directory
  2. wp-cli 安装脚本(具有正确的依赖项)也适用于 dockerfile.php-fpm(my-php 映像),它也会返回错误: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. 并让我使用标志运行此命令 - -allow-root,在这种情况下这很糟糕,因为我想使用 wp 用户权限。或以其他用户身份运行此命令。

核心配置

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;
  }
}

wp-cli 集成克隆自:https://github.com/conetix/docker-wordpress-wp-cli

选项 1

Dockerfile:

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

选项 2

Dockerfile:

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

一般问题:

  1. 在 docker 中用户权限的最佳做法是什么?
  2. 来自https://github.com/conetix/docker-wordpress-wp-cli/blob/master/wp-su.sh 的wp-cli 集成使用www-data 用户-我应该将此用户添加到我的docker,如果是的话-添加到哪一个? ngnix 或 php-fpm 以及为什么。
  3. 从 php-fpm 容器 appaers 运行 wp donlowd 核心,就像它下载文件一样,但是当我尝试在其运行时执行时,这些文件都不会显示在 /var/www/html 中。是否有某种方法可以订购图像文件挂载?
  4. 如果我卷,为什么'php' 不可用来自 my-nginx 的命令
    我的 PHP 图像?我还必须在这张图片上安装 php 吗?

【问题讨论】:

    标签: wordpress docker docker-compose


    【解决方案1】:

    PHP 未安装在您的 nginx 容器中。我认为它也不应该安装在那里。使用您的 php fpm 容器运行 WP CLI。以下是我使用类似设置运行 WP CLI 的方法:

    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
    

    docker/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
    

    我还使用 memcached 容器,这就是 dockerfile 也安装 memcached 扩展的原因。重要的部分是它安装 WP CLI 并将其移动到位的位置。您还可以通过在该 dockerfile 中更改已安装的 PHP 版本来修改它。在 PHP 上安装 WP CLI 并启动集群并运行后,您可以运行以下命令在容器内运行 wp cli 命令:

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

    我有不同项目的别名,这些项目已经有了容器名称:

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

    这让我可以像这样运行 wp 命令:

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

    【讨论】:

    • www-data 用户在哪里定义?
    • 它只存在于 PHP FPM 框中。 PHP 框已将其预先定义为运行 fpm 进程的用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多