【问题标题】:How to run wp cli in docker-compose.yml如何在 docker-compose.yml 中运行 wp cli
【发布时间】:2026-01-14 07:20:02
【问题描述】:

刚从 docker 开始

所以我在我的 docker-compose.yml

中得到了这个
version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - 8000:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_TABLE_PREFIX: "wp_"
      WORDPRESS_DEBUG: 1

  wordpress-cli:
    depends_on:
      - db
      - wordpress
    image: wordpress:cli
    command: wp core install --path="/var/www/html" --url=localhost --title="Local Wordpress By Docker" --admin_user=admin --admin_password=secret --admin_email=foo@bar.com

volumes:
  db_data:

所以我想运行 wp core install,这样我就不必经历手动设置我的测试 wordpress 网站的过程。

但是当我运行 docker-compose up 时,这似乎不起作用,我在控制台上收到此错误

我在这里缺少什么?任何人都可以帮助我实现自动设置 wordpress 安装的目标吗?

提前致谢

【问题讨论】:

    标签: wordpress docker docker-compose dockerfile


    【解决方案1】:

    嗯,有几个问题。第一个是这两个容器(wordpresswordpress-cli)不共享一个卷。所以虽然wordpress 已经准备好安装wordpress,但wordpress-cli 没有。

    因此您可以将卷添加到两个容器中,然后wordpress-cli 将找到 wordpress 安装。

    还有第二个问题:wordpress:latestwordpress:cli 图像都与用户www-data 一起运行,但问题是各个www-data 用户有不同的用户ID:

    $ docker run --rm wordpress:latest grep www-data /etc/passwd 
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    $ docker run --rm wordpress:cli grep www-data /etc/passwd   
    www-data:x:82:82:Linux User,,,:/home/www-data:/bin/false
    

    似乎它们在这里并不完全兼容。因此,如果您使用共享卷,则必须确保它们都使用相同的用户 ID。我通过让 wordpress:cli 与用户 xfs 一起运行来解决这个问题,用户 ID 也为 33。

    最后一个问题是你的容器相互依赖。 Wordpress 需要一个正在运行的 MySQL 实例,并且 wordpress-cli 还需要准备好 MySQL 和 Wordpress。为确保 MySQL 已准备好安装 wordpress cli,您可以使用 "wait-for-it" 之类的东西,或者在简单的情况下,您可以等待几秒钟然后尝试。

    我已经测试了所有这些更改并提出了以下docker-compose.yml。我已经用“vstm”注释了我所做的所有更改:

    version: "3.3"
    services:
      db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
    
      wordpress:
        depends_on:
          - db
        image: wordpress:latest
        ports:
          - 8000:80
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_NAME: wordpress
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_TABLE_PREFIX: "wp_"
          WORDPRESS_DEBUG: 1
        # vstm: add shared volume
        volumes:
          - wp_data:/var/www/html
    
      wordpress-cli:
        depends_on:
          - db
          - wordpress
        image: wordpress:cli
        # vstm: This is required to run wordpress-cli with the same
        # user-id as wordpress. This way there are no permission problems
        # when running the cli
        user: xfs
        # vstm: The sleep 10 is required so that the command is run after
        # mysql is initialized. Depending on your machine this might take
        # longer or it can go faster.
        command: >
          /bin/sh -c '
          sleep 10;
          wp core install --path="/var/www/html" --url="http://localhost:8000" --title="Local Wordpress By Docker" --admin_user=admin --admin_password=secret --admin_email=foo@bar.com
          '
        # vstm: add shared volume
        volumes:
          - wp_data:/var/www/html
    
    volumes:
      db_data:
      # vstm: add shared volume
      wp_data:
    

    它使用 docker-volume,但您也可以将其映射到文件系统。取决于您计划如何使用 docker-compose。

    【讨论】:

    • 非常感谢你,伙计!在 Windows 10 pro 上尝试了 Docker CE 18.03 并且成功了!非常详细的解释,不胜感激!
    • 嘿伙计,如果不是很麻烦,您能详细说明一下 user:xfs 部分吗?基本上这个命令将活动用户切换到xfs?那么 xfs 是由 wordpress:cli 容器创建的用户吗?提前致谢。
    • 我已经在回答中稍微提到了 xfs 部分,但要点是wordpress:cli 图像中的 xfs 用户的 UID 为 33,与 www- 的 UID 相同wordpress:latest 图像中的数据用户。让两个命令使用相同的 UID 运行非常重要,这样它们就可以在没有权限问题的情况下读取/写入共享卷 (wp_data)。
    • @vstm version: "2.3" 是错字吗,应该是3.3 吗?
    • 这似乎不再起作用了,逐字复制并粘贴示例并得到Error: This does not seem to be a WordPress installation.
    【解决方案2】:

    这个对我有用:

      wpcli:
        depends_on: 
          - mysql
          - wordpress
        image: wordpress:cli
        links:
          - mysql:db
        entrypoint: wp
        command: "--info"
        container_name: ${COMPOSE_PROJECT_NAME}_wpcli
        volumes:
          - ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html
        working_dir: /var/www/html
    

    注意在这一行:

    links:
      - mysql:db
    

    mysql = 我的服务名称 db = 我给它的别名,可以是任何东西

    然后你像这样发出 run wp :

    docker-compose run --rm wpcli WORDPRESS_COMMAND

    来源:https://medium.com/@tatemz/using-wp-cli-with-docker-21b0ab9fab79

    【讨论】:

      【解决方案3】:

      这是我在 Stack Overflow 的第一个答案:">

      其实你的问题启发了我,@vstm的回答对我有点启发。

      你可以试试我的一段代码:

      1.wait-for-mysql.sh

      #!/bin/bash -e
      
      HOST=$(echo $WORDPRESS_DB_HOST | cut -d: -f1)
      PORT=$(echo $WORDPRESS_DB_HOST | cut -d: -f2)
      
      CMD=$@
      
      until mysql -h $HOST -P $PORT -D $WORDPRESS_DB_NAME -u $WORDPRESS_DB_USER -p$WORDPRESS_DB_PASSWORD -e '\q'; do
        >&2 echo "Mysql is unavailable - sleeping..."
        sleep 2
      done
      
      >&2 echo "Mysql is up - executing command"
      exec $CMD
      

      2.compose.yml

      version: '3.9'
      
      services:
      
        wordpress:
          image: wordpress:5.7.0-php7.4-apache
          ports:
            - "80:80"
          volumes:
            - ./wp-data/:/var/www/html/
          networks:
            wp-net: {}
      
        wp-cli:
          image: wordpress:cli-2.4.0-php7.4
          depends_on:
            - wordpress
          volumes:
            - ./wait-for-mysql.sh:/wait-for-mysql.sh
            - ./wp-data:/var/www/html/ # shared with wordpress service
          user: "33"
          command: >
            /wait-for-mysql.sh
            wp core install
            --path="/var/www/html"
            --url="http://your-url-here"
            --title=your-title-here
            --admin_user=your-user-here
            --admin_password=your-password-here
            --admin_email=your-email-here}
            --skip-email
          networks:
            wp-net: {}
      
      networks:
        wp-net: {}
      

      供您参考:

      【讨论】:

        最近更新 更多