我基于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_HOST
、WORDPRESS_DB_NAME
、WORDPRESS_DB_PASSWORD
和WORDPRESS_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项目不行?