如何在docker上更新wordpress

时间:2018-05-01 15:38:01

标签: wordpress docker

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

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

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

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

我的dockerfile:

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

期待阅读您的建议

谢谢

6 个答案:

答案 0 :(得分:3)

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

我覆盖了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

答案 1 :(得分:2)

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

修改

根据this,只需删除index.phpwp-includes/version.php即可再次从容器中复制文件。或者,您可以更新entrypoint脚本以便始终将文件复制到/var/www/html,但如果您选择缩放wordpress图层,则可能会出现问题。

答案 2 :(得分:1)

为了扩展@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

我希望这会有所帮助!?

答案 3 :(得分:1)

这是更简单的解决方案。

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

记住!更新前先备份:)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

<块引用>

我的回答适用于官方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 来调用更新。