我基于official Wordpress Docker image设置了一个容器化的WordPress项目作为Azure应用程序服务,其中除了根据Azure给出的说明添加SSH服务器外,我没有对镜像本身进行任何修改.Dockerfile如下所示:

FROM wordpress:6.0.3-php7.4

########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
    && apt install -y openssh-server \
    && rm -rf /var/lib/apt/lists/*

RUN echo "root:Docker!" | chpasswd

# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/

# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
    && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)

# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################

COPY docker/script.sh script.sh
RUN chmod +x script.sh
CMD []
ENTRYPOINT ["./script.sh"]

docker/script.sh

#!/bin/bash
exec service ssh start &
exec /usr/local/bin/docker-entrypoint.sh apache2-foreground

在App Service上,我添加了WEBSITES_ENABLE_APP_SERVICE_STORAGE=true应用程序设置以启用persistent storage,并设置了WORDPRESS_DB_HOSTWORDPRESS_DB_NAMEWORDPRESS_DB_PASSWORDWORDPRESS_DB_USER设置以连接到我在另一台主机上运行的数据库.

当在浏览器中访问应用程序服务页面并通过WordPress设置时,我可以轻松地上传新文件,这些文件被放置在/var/www/html/wp-content/uploads/<year>/<month>/<filename>的文件系统中,然后我可以在https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename>的浏览器中访问这些文件.

由于Azure只持久化在/home中写入的数据,所以我try 将/var/www/html/wp-content/uploads目录移动到/home/uploads,然后从预期路径创建一个指向此目录的符号链接,如下所示(然后也可以将符号链接创建添加到Dockerfile以在部署期间自动执行此操作):

$ cd /var/www/html/wp-content
$ mv uploads /home/uploads
$ ln -s /home/uploads uploads

然而,现在当我访问https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename>时,我只得到一个空的400响应.

为了弄清这是否是Azure的某种限制,我决定用最简单的Python页面来try 一些类似的东西.文档文件:

FROM python:3.10.0
RUN mkdir -p /var/www/html
WORKDIR /var/www/html

########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
    && apt install -y openssh-server \
    && rm -rf /var/lib/apt/lists/*

RUN echo "root:Docker!" | chpasswd

# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/

# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
    && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)

# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################

COPY docker/script.sh script.sh
RUN chmod +x script.sh
CMD []
ENTRYPOINT ["./script.sh"]

和docker/script.sh

#!/bin/bash
exec service ssh start &
exec python -m http.server 80

在这里做同样的事情很管用,所以这似乎不是Azure的限制.然而,我不明白的是,带有符号链接的Wordpress docker图像在我的本地计算机上运行时,工作正常.

我做错了什么?为什么Python项目可以工作,而WordPress项目不行?

推荐答案

通过添加别名而不是禁用MMAP的符号链接and解决了该问题:

docker/extra.conf:

Alias /wp-content/uploads/ "/home/uploads/"
<Directory "/home/uploads/">
        Options Indexes MultiViews
        AllowOverride None
        Require all granted
</Directory>

<Directory "/home/uploads">
  EnableMMAP Off
</Directory>

docker/script.sh

#!/bin/bash
exec service ssh start &
exec /usr/local/bin/docker-entrypoint.sh apache2-foreground

Dockerfile

FROM wordpress:6.0.3-php7.4

########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
    && apt install -y openssh-server \
    && rm -rf /var/lib/apt/lists/*

RUN echo "root:Docker!" | chpasswd

# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/

# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
    && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)

# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################

COPY docker/apache/extra.conf /etc/apache2/extra.conf
RUN cat /etc/apache2/extra.conf >> /etc/apache2/apache2.conf

COPY docker/script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
CMD []
ENTRYPOINT ["/usr/local/bin/script.sh"]

Php相关问答推荐

Laravel 10 -扩展现有的artisan命令?

根据未用于变体的产品属性隐藏WooCommerce发货方式

为什么在我的PHP联系人脚本中开机自检后出现未定义变量错误?

WooCommerce HPOS管理订单列表中带有订单元数据的定制列

如何使用php一次更新两个数据库中的MySQL表

免费送货柜台,考虑到折扣码

Woocommerce单一产品Ajax添加到带有自定义购物车项目数据的购物车

防止在WordPress短代码中显示重复产品并请求代码更正

PHP 8.2 弃用日志(log)存储在 Laravel 10.22.0 中的哪里?

使用帖子 ID 更新 wp 帖子

WooCommerce:如果订单总数为零,则隐藏本地取货运输选项

在php中计算两个没有假期的日期之间的小时差

VS Code 对 PHP 上从父类继承的方法报告误报

Symfony 迁移判断器在我的工作中失控

php var_dump(1) 返回字符串(4)

服务器遇到内部错误或配置错误,无法完成您的请求

如何使用动态变量定义 bind_result?

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

遇到特定键时修改二维数组以创建嵌套数据集

try 在 Laravel Blade 上显示值时出现未定义的变量 X 问题