docker打包nginx版wordpress

官方打包的wordpress的docker版是基于apache,在低配的机器上容易挂掉。所以考虑nginx

Dockerfile

# 更改基础镜像为PHP 8.x FPM Alpine
FROM php:8.2-fpm-alpine# 更新并安装PHP依赖,注意检查扩展与PHP 8.x的兼容性
# 这里不用php8.3 因为安装imagick有问题,参考https://github.com/Imagick/imagick/issues/643
RUN apk update && \apk add zlib-dev libpng-dev jpeg-dev expat-dev libzip-dev icu-libs icu-dev libtool imagemagick-dev && \apk add m4 autoconf make gcc g++ linux-headers && \docker-php-ext-install pdo_mysql opcache mysqli && \docker-php-ext-install gd && \docker-php-ext-install exif zip intl && \pecl install imagick && docker-php-ext-enable imagick && \apk del m4 autoconf make gcc g++ linux-headers# 安装时区
RUN apk add --no-cache tzdata# 安装nginx依赖
RUN apk add nginx && \if [ ! -d "/run/nginx" ]; then mkdir /run/nginx; fi && \touch /run/nginx/nginx.pid# nginx配置文件和初始静态文件
ADD default.conf /etc/nginx/http.d/default.conf
ADD index.html /var/www/html/index.html# 安装wget unzip tar 后续下载wordpress使用
RUN apk add --no-cache wget unzip tar
# 中文版下载 https://cn.wordpress.org/wordpress-latest-zh_CN.tar.gz https://cn.wordpress.org/wordpress-6.7-zh_CN.tar.gz
# 英文版下载 https://wordpress.org/latest.tar.gz
# 下载并解压 WordPress
RUN wget https://cn.wordpress.org/wordpress-latest-zh_CN.tar.gz -O /tmp/wordpress.tar.gz && \tar zxvf /tmp/wordpress.tar.gz -C /tmp/ && \mv /tmp/wordpress/* /var/www/html && \rm /tmp/wordpress.tar.gz# 拷贝源代码到容器内
COPY src /var/www/html/# 官方wordpress镜像还使用了wp-config-docker.php 并用shell脚本执行后把wp-config.php文件进行更改
# 文件的作用是可以使用docker环境变量配置数据库参数
# 官方镜像多出来的两个文件路径
# /usr/src/wordpress/wp-config-docker.php
# /usr/local/bin/docker-entrypoint.shADD wp-config-docker.php /var/www/html/wp-config-docker.php# 添加自定义脚本
ADD generate_wp_config.sh /
RUN chmod 755 /generate_wp_config.sh# 更改/var/www/html目录的所有权
RUN apk add coreutils  && \chown www-data:www-data /var/www/html  && \chmod 1777 /var/www/html  && \chown -R www-data:www-data /var/www/html/wp-content  && \chmod -R 1777 /var/www/html/wp-content# 下面处理更新版本升级权限
# wp-admin授权用户www-data:www-data可以防止网页更新版本报错
# 另一更新正在运行 执行sql DELETE FROM wp_options WHERE option_name='core_updater.lock';
RUN chown -R www-data:www-data /var/www/html/wp-admin && \chown -R www-data:www-data /var/www/html/wp-includes  && \cd /var/www/html/ && \chown www-data:www-data wp-login.php wp-cron.php wp-trackback.php wp-config-sample.php wp-settings.php wp-mail.php# 添加自定义脚本
ADD run.sh /
RUN chmod 755 /run.sh# 暴露端口
EXPOSE 80
EXPOSE 9000# 入口点设置为自定义脚本
ENTRYPOINT ["/run.sh"]

dockerfile使用到的文件

wp-config-docker.php

<?php
/*** The base configuration for WordPress** The wp-config.php creation script uses this file during the installation.* You don't have to use the website, you can copy this file to "wp-config.php"* and fill in the values.** This file contains the following configurations:** * Database settings* * Secret keys* * Database table prefix* * ABSPATH** This has been slightly modified (to read environment variables) for use in Docker.** @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/** @package WordPress*/// IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php
// (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)// a helper function to lookup "env_FILE", "env", then fallback
if (!function_exists('getenv_docker')) {// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)function getenv_docker($env, $default) {if ($fileEnv = getenv($env . '_FILE')) {return rtrim(file_get_contents($fileEnv), "\r\n");}else if (($val = getenv($env)) !== false) {return $val;}else {return $default;}}
}// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );/** Database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );/** Database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );/*** Docker image fallback values above are sourced from the official WordPress installation wizard:* https://github.com/WordPress/WordPress/blob/1356f6537220ffdc32b9dad2a6cdbe2d010b7a88/wp-admin/setup-config.php#L224-L238* (However, using "example username" and "example password" in your database is strongly discouraged.  Please use strong, random credentials!)*//** Database hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8') );/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );/**#@+* Authentication unique keys and salts.** Change these to different unique phrases! You can generate these using* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.** You can change these at any point in time to invalidate all existing cookies.* This will force all users to have to log in again.** @since 2.6.0*/
define( 'AUTH_KEY',         getenv_docker('WORDPRESS_AUTH_KEY',         'put your unique phrase here') );
define( 'SECURE_AUTH_KEY',  getenv_docker('WORDPRESS_SECURE_AUTH_KEY',  'put your unique phrase here') );
define( 'LOGGED_IN_KEY',    getenv_docker('WORDPRESS_LOGGED_IN_KEY',    'put your unique phrase here') );
define( 'NONCE_KEY',        getenv_docker('WORDPRESS_NONCE_KEY',        'put your unique phrase here') );
define( 'AUTH_SALT',        getenv_docker('WORDPRESS_AUTH_SALT',        'put your unique phrase here') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', 'put your unique phrase here') );
define( 'LOGGED_IN_SALT',   getenv_docker('WORDPRESS_LOGGED_IN_SALT',   'put your unique phrase here') );
define( 'NONCE_SALT',       getenv_docker('WORDPRESS_NONCE_SALT',       'put your unique phrase here') );
// (See also https://wordpress.stackexchange.com/a/152905/199287)/**#@-*//*** WordPress database table prefix.** You can have multiple installations in one database if you give each* a unique prefix. Only numbers, letters, and underscores please!** At the installation time, database tables are created with the specified prefix.* Changing this value after WordPress is installed will make your site think* it has not been installed.** @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix*/
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');/*** For developers: WordPress debugging mode.** Change this to true to enable the display of notices during development.* It is strongly recommended that plugin and theme developers use WP_DEBUG* in their development environments.** For information on other constants that can be used for debugging,* visit the documentation.** @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/*/
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );/* Add any custom values between this line and the "stop editing" line. */// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {$_SERVER['HTTPS'] = 'on';
}
// (we include this by default because reverse proxying is extremely common in container environments)if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {eval($configExtra);
}/* That's all, stop editing! Happy publishing. *//** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {define( 'ABSPATH', __DIR__ . '/' );
}/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

generate_wp_config.sh

#!/usr/bin/env shset -eu# 获取当前用户的 UID 和 GID
uid="$(id -u)"
gid="$(id -g)"# 获取所有以 WORDPRESS_ 开头的环境变量名称
wpEnvs=$(env | grep ^WORDPRESS_ | cut -d= -f1)# 检查 wp-config.php 是否存在且不为空
if [ ! -s wp-config.php ] && [ -n "$wpEnvs" ]; thenfor wpConfigDocker in \wp-config-docker.php \/usr/src/wordpress/wp-config-docker.php \; doif [ -s "$wpConfigDocker" ]; thenecho >&2 "No 'wp-config.php' found in $PWD, but 'WORDPRESS_...' variables supplied; copying '$wpConfigDocker' ($wpEnvs)"# 使用 awk 替换所有 "put your unique phrase here" 为唯一的字符串awk '/put your unique phrase here/ {cmd = "head -c1m /dev/urandom | sha1sum | cut -d\\  -f1"cmd | getline strclose(cmd)gsub("put your unique phrase here", str)}{ print }' "$wpConfigDocker" > wp-config.phpif [ "$uid" = '0' ]; then# 尝试确保 wp-config.php 由运行用户拥有# 可能在某些文件系统上不允许 chown(例如某些 NFS 设置)chown "$(id -un):$(id -gn)" wp-config.php || truefibreakfidone
fi

docker里的环境变量主要靠上面两个文件实现。

run.sh

#!/bin/sh# 切换到 /var/www/html 目录
cd /var/www/html
# 调用生成 wp-config.php 的脚本
/generate_wp_config.sh# 后台启动php-fpm
php-fpm -D
# 关闭后台启动,hold住进程
nginx -g 'daemon off;'

default.conf

server {listen 80;server_name localhost;root /var/www/html;index index.php index.html index.htm index.nginx-debian.html;error_log  /var/log/nginx/error.log;access_log /var/log/nginx/access.log;location / {try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;# 添加以下行来传递客户端 IP 和协议信息proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}# 新增规则来保护以点号开头的隐藏文件location ~ /\. {deny all;}location ~ /\.ht {deny all;}location = /favicon.ico {log_not_found off;access_log off;}location = /robots.txt {allow all;log_not_found off;access_log off;}location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {expires max;log_not_found off;access_log off;}
}

index.html

<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title><style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

src/info.php


<?phpphpinfo();
?>

构建完成后,相比官方版减少200M,负载也减轻了。这个打包完是简体中文版,不用再下载语言包了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15582.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【大语言模型】ACL2024论文-10 CSCD-IME: 纠正拼音输入法产生的拼写错误

【大语言模型】ACL2024论文-10 CSCD-IME: 纠正拼音输入法产生的拼写错误 目录 文章目录 【大语言模型】ACL2024论文-10 CSCD-IME: 纠正拼音输入法产生的拼写错误目录摘要研究背景问题与挑战如何解决创新点算法模型1. 错误检测模型2. 伪数据生成模块3. n-gram语言模型过滤4. 多任…

前端(2)——快速入门CSS

参考&#xff1a; 罗大富 CSS 参考手册 | 菜鸟教程 CSS 参考手册 1. CSS CSS全名是层叠样式表&#xff0c;中文名层叠样式表。用于定义网页样式和布局的样式表语言。 通过 CSS&#xff0c;你可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式&#xff0c;…

电阻测试流程

1.外观检查 &#xff08;1&#xff09;样品上丝印与规格书中相符&#xff0c;0402以上封装电阻要有标称电阻值&#xff0c;丝印清晰。 &#xff08;2&#xff09;检验外观&#xff0c;主要包含以下几点&#xff1a; a) 电阻器本体饱满&#xff0c;有光泽&#xff0c;不允许有气…

万博智云产品完成与ZStack Cloud云平台兼容性互认证

摘要 近日&#xff0c;上海云轴科技股份有限公司(简称“云轴科技ZStack”)与万博智云信息科技&#xff08;上海&#xff09;有限公司&#xff08;简称“万博智云OnePro Cloud”&#xff09;完成产品兼容性互认证。经过测试&#xff0c;万博智云OnePro Cloud两款旗舰产品HyperB…

深度学习框架Pytorch介绍和示例

目录 一. 简介 1.1动态计算图 1.2自动化功能 二. 主要特性 2.1 动态计算图 2.2 自动求导 2.3 强大的社区支持 2.4 多平台支持 三. 核心组件 3.1 Tensor 3.2 Autograd 3.3 nn.Module 3.4 Optim 四. 数据处理 五. 神经网络定义与训练 5.1定义神经网络&#xff1a; 5.2训练过…

鼠标点击(二)与接口函数集合的的实现

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;

基于Spring Boot+Vue的多媒体素材管理系统的设计与实现

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

《FreeRTOS列表和列表项篇》

FreeRTOS列表和列表项 1. 什么是列表和列表项&#xff1f;1.1 列表list1.2 列表项list item 2. 列表和列表项的初始化2.1 列表的初始化2.2 列表项的初始化 3. 列表项的插入4. 列表项末尾插入5. 列表项的删除6. 列表的遍历 列表和列表项是FreeRTOS的一个数据结构&#xff0c;是F…

使用 MTT GPU 搭建个人 RAG 推理服务

什么是 LLM RAG?​ LLM RAG&#xff08;Retrieval-Augmented Generation with Large Language Models&#xff09;是一种结合大语言模型&#xff08;LLM&#xff09;和信息检索&#xff08;IR&#xff09;技术的生成方法&#xff0c;专门用于增强语言模型的上下文感知和准确性…

Vue3 -- 环境变量的配置【项目集成3】

环境&#xff1a; 在项目开发过程中&#xff0c;至少会经历开发环境、测试环境和生产环境(即正式环境)三个阶段。 开发环境 .env.development测试环境 .env.test生产环境 .env.production 不同阶段请求的状态(如接口地址等)不一样&#xff0c;开发项目的时候要经常配置代理跨…

AI 大模型应用:AI开发的捷径工作流模式

一、引言 大部分人使用 AI&#xff0c;大概都跟我一样&#xff0c;停留在初级阶段。 平时&#xff0c;就是向 AI 提问&#xff08;又称聊天&#xff09;&#xff0c;偶尔也用一些现成的服务&#xff1a;生成图片、生成代码、翻译文章等等。 但是&#xff0c;时间久了&#x…

研究生被安排许多文献阅读,如何快速的阅读众多英文文献?

在科研的道路上&#xff0c;筛选文献就像是大海捞针&#xff0c;找对了方法&#xff0c;就能快速锁定那些有价值的信息。尤其是在实验方向尚未确定时&#xff0c;如何从海量文献中筛选出“金子”&#xff0c;就显得尤为重要。 关键的第一步&#xff1a;精准筛选 当你面对一堆…

信创迎来冲刺三年,国产项目管理软件跑出数智化“加速度”

信创发展是国家当前重要的战略布局&#xff0c;对国家发展具有长远的战略意义。国资委信创79号文件规定&#xff0c;2027年前按顺序完成“28N”的党政与八大重点行业100%信创替代&#xff0c;通过信创产业发展&#xff0c;国家能够提高自主创新能力&#xff0c;加速推进国产化转…

LSTM(长短期记忆网络)详解

1️⃣ LSTM介绍 标准的RNN存在梯度消失和梯度爆炸问题&#xff0c;无法捕捉长期依赖关系。那么如何理解这个长期依赖关系呢&#xff1f; 例如&#xff0c;有一个语言模型基于先前的词来预测下一个词&#xff0c;我们有一句话 “the clouds are in the sky”&#xff0c;基于&…

基于Java仓库管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、LayUI 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0 数据库管…

数量关系2_余数平方等差、整除和完工

目录 一、余数、平方数与等差数列1.等差数列2.平方数3.余数问题二、整除问题和合作完工问题1.利用倍数特性解决不定方程2.利用整除特性解决纯整除问题3.合作完工一、余数、平方数与等差数列 1.等差数列 ※等比数列不常考,或者考的时候比较复杂,可放弃。 补充1:常用的等差数…

cache中命中率和缺失率

这张图解释了缓存的三个关键指标&#xff1a;命中率、缺失率和缺失损失&#xff0c;并分析了它们在缓存访问中的重要性。 具体说明 命中&#xff08;Hit&#xff09;&#xff1a; 命中表示要访问的信息在缓存中已经存在&#xff0c;不需要从更慢的主存中读取。命中率&#xff…

Jmeter查看结果树之查看响应的13种详解方法

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 Jmeter查看结果树查看响应有哪几种方法&#xff0c;可通过左侧面板底部的下拉框选择: 01 Te…

<Project-23 Navigator Portal> Python flask web 网站导航应用 可编辑界面:添加图片、URL、描述、位置移动

目的&#xff1a; 浏览器的地址簿太厚&#xff0c;如下图&#xff1a; 开始&#xff0c;想给每个 Web 应用加 icon 来提高辨识度&#xff0c;发现很麻烦&#xff1a;create image, resize, 还要挑来挑去&#xff0c;重复性地添加代码。再看着这些密密麻麻的含有重复与有规则的…

文心一言 VS 讯飞星火 VS chatgpt (391)-- 算法导论25.1 5题

五、说明如何将单源最短路径问题表示为矩阵和向量的乘积&#xff0c;并解释该乘积的计算过程如何对应 Bellman-Ford 算法&#xff1f;(请参阅24.1节。)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在解决单源最短路径问题时&#xff0c;我们可以将问题表示…