我正在运行一个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
期待阅读您的建议
谢谢
答案 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.php
或wp-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"]
这里要注意两件事:
chmod 755
文件,否则我将得到一个权限被拒绝的错误/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 down
和 docker-compose up -d
来调用更新。