【问题标题】:How to update wordpress on docker如何在 docker 上更新 wordpress
【发布时间】:2021-02-12 19:22:17
【问题描述】:

我正在运行一个 php-fpm wordpress 容器。

wordpress 源文件安装在与 Nginx 容器共享的命名卷“wordpress”中。

除了我需要将 wordpress 更新到新版本时,一切都运行良好。命名卷内的代码仍然存在。命名卷是正常的...

我可以手动删除卷,但必须有更好的方法。

我的码头文件:

FROM wordpress:4.9.5-php5.6-fpm-alpine

我的 docker-compose.yml

version: '3.1'

services:

  php:
    build: ./docker/php/
    restart: unless-stopped
    volumes:
      - wordpress:/var/www/html
      - ./web/wp-content/:/var/www/html/wp-content/
      - ./web/wp-config.php:/var/www/html/wp-config.php

    environment:
      - DEBUG=${DEBUG:-0}
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
      - MYSQL_DATABASE=$MYSQL_DATABASE

  nginx:
    image: nginx:1-alpine
    restart: unless-stopped
    expose:
      - 80
    volumes:
      - wordpress:/var/www/html
      - ./web/wp-content/:/var/www/html/wp-content/
      - ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf
      - ./docker/nginx/wordpress.conf:/etc/nginx/wordpress.conf
    environment:
      - VIRTUAL_HOST=localhost

  mysql:
    image: mysql:5.6
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASSWORD
      - MYSQL_DATABASE=$MYSQL_DATABASE
    volumes:
      - mysql:/var/lib/mysql

volumes:
  wordpress: {}
  mysql: {}

networks:
  default:
    external:
      name: wordpress

期待阅读您的建议

谢谢

【问题讨论】:

    标签: wordpress docker


    【解决方案1】:

    当 wordpress 容器出现时,它会检查 /var/www/html 处的文件是否存在,如果不存在则仅复制。因此,在您的情况下,您可以更新entrypoint 脚本以检查/var/www/htmlwp-includes/version.php 中的wordpress 版本以及容器中的文件,然后决定替换新文件。

    编辑:

    根据this 只是删除index.phpwp-includes/version.php 应该再次从容器中复制文件。或者您可以更新您的entrypoint 脚本以将文件一直复制到/var/www/html,但是如果您选择缩放wordpress 层,这可能会导致问题。

    【讨论】:

    • 这对我来说似乎是一个非常可行的解决方案,只需稍作调整以使其适合您的工作流程。
    • 小修正:您需要删除两个文件(index.php 和 wp-includes/version.php),然后重新创建图像。我想这已经随着时间的推移而改变了:github.com/docker-library/wordpress/blob/master/php7.1/fpm/…
    【解决方案2】:

    感谢您的帮助。 有效。 这是我正在使用的代码。

    我覆盖了 dockerfile 中的入口点

    COPY check-wordpress-version.sh /usr/local/bin/
    
    ENTRYPOINT ["check-wordpress-version.sh"]
    

    这里是检查wordpress当前版本的check-wordpress-version.sh的内容。

    VOLUME_VERSION="$(php -r 'require('"'"'/var/www/html/wp-includes/version.php'"'"'); echo $wp_version;')"
    echo "Volume version : "$VOLUME_VERSION
    echo "WordPress version : "$WORDPRESS_VERSION
    
    if [ $VOLUME_VERSION != $WORDPRESS_VERSION ]; then
        echo "Forcing WordPress code update..."
        rm -f /var/www/html/index.php
    fi
    
    docker-entrypoint.sh php-fpm
    

    【讨论】:

      【解决方案3】:

      Wordpress 似乎在this issue 下解决了这个问题。

      我注意到您正在使用自定义 wp-config.php。最有可能的是,您可以为此使用WORDPRESS_CONFIG_EXTRA,而不是安装wp-config.php

      理论上(根据上面的链接),更新图像应该更新数据库,但我还没有确认。

      基于此,我的stack.yml/docker-compose.yml看起来像这样:

          environment:
            WORDPRESS_CONFIG_EXTRA: |
              define( 'AUTOMATIC_UPDATER_DISABLED', true );
          volumes:
            - "./themes:/var/www/html/wp-content/themes/"
            - "./plugins:/var/www/html/wp-content/plugins/"
            - "./uploads:/var/www/html/wp-content/uploads/"
      

      【讨论】:

      • 您是否也在使用反向代理(例如 nginx)?在哪种情况下,您为 nginx 容器定义了哪些卷?
      • 我正在使用 jasonheecs/nginx-proxy。我必须定义的唯一卷是根据基础映像(nginxproxy/nginx-proxy)的文档用于 TLS 证书。
      【解决方案4】:

      更简单的解决方案。

      您必须通过在文件末尾添加define('FS_METHOD','direct'); 来编辑wp-config.php 文件。 保存文件并运行更新。从现在开始,您不再需要 FTP 服务器来更新您的 WordPress。

      记住!更新前做好备份:)

      【讨论】:

        【解决方案5】:

        为了解决@Bigbenny 的问题,我的 Dockerfile 如下所示:

        FROM wordpress:latest
        
        WORKDIR /var/www/html
        
        COPY . /var/www/html
        
        COPY check-wordpress-version.sh /usr/local/bin/
        
        RUN chmod 755 /usr/local/bin/check-wordpress-version.sh
        
        ENTRYPOINT ["/usr/local/bin/check-wordpress-version.sh"]
        

        这里需要注意两点:

        1. 我必须chmod 755 文件,否则我会收到权限被拒绝错误
        2. 我将脚本放在/usr/local/bin 中,因为出于某种原因,当我只使用ENTRYPOINT["check-wordpress-version.sh"] 时,容器找不到该文件。

        我还稍微调整了脚本,使其看起来像:

        #!/bin/sh
        
        VOLUME_VERSION="$(php -r 'require('"'"'/var/www/html/wp-includes/version.php'"'"'); echo $wp_version;')"
        echo "Volume version : "$VOLUME_VERSION
        echo "WordPress version : "$WORDPRESS_VERSION
        
        if [ $VOLUME_VERSION != $WORDPRESS_VERSION ]; then
            echo "Forcing WordPress code update..."
            rm -f /var/www/html/index.php
            rm -f /var/www/html/wp-includes/version.php
        fi
        
        docker-entrypoint.sh apache2-foreground
        
        

        对于我的用例,我必须使用apache2-foreground 而不是php-fpm;我还删除了/var/www/html/wp-includes/version.php 文件。

        最后,在我的 docker-compose 中,而不是使用 image 指令;我用build: ./wordpress

        我希望这会有所帮助!?

        【讨论】:

          【解决方案6】:

          我的回答适用于官方docker wordpress image。所以 可能跑题了,但可能会对某人有所帮助。

          如果您使用的是docker-compose,您可以使用此命令拉取最新的图像。

          docker pull wordpress
          

          我相信这会更新您的核心 docker 映像。您docker-compose up -d 使用此 yml 映像设置的任何其他本地项目,因为这将使用最新更新。

            services:
              wordpress:
                image: wordpress:latest
          

          如果您当前正在运行映像,则需要 docker-compose downdocker-compose up -d 来调用更新。

          【讨论】:

            猜你喜欢
            • 2016-01-17
            • 2014-05-05
            • 1970-01-01
            • 2017-09-29
            • 2016-05-27
            • 2023-04-04
            • 2016-03-12
            • 2017-09-04
            • 1970-01-01
            相关资源
            最近更新 更多