提问人:Manthan 提问时间:11/16/2023 最后编辑:Manthan 更新时间:11/17/2023 访问量:60
Azure 应用服务容器 命名卷存储在哪里?
Azure App Service Containers where are named volumes stored?
问:
我正在尝试使用MySQL后端托管CalDAV服务器(贝加尔湖) - 但问题与这些图像无关。我的样子是这样的docker-compose.yml
version: "3.4"
services:
mysqldb:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: kU47k9PpjU5A
MYSQL_DATABASE: baikal
MYSQL_USER: baikal
MYSQL_PASSWORD: PY74bSs72fkT
volumes:
- db_data:/var/lib/mysql
baikal:
image: ckulka/baikal:nginx
container_name: baikal
restart: always
ports:
# These ports are in format <host-port>:<container-port>
- 80:80
volumes:
- baikal_specific:/var/www/baikal/Specific
- baikal_config:/var/www/baikal/config
volumes:
db_data:
baikal_specific:
baikal_config:
我使用了命名卷并将设置设置为 .这完美无缺,我能够在应用程序重启之间存储和保留数据。WEBSITES_ENABLE_APP_SERVICE_STORAGE
true
但是我无法找到文件系统上存储的卷的确切位置(我通过 Kudu 中的 bash shell 搜索)。我四处寻找(甚至在/home目录之外),但找不到它们。我无法运行,因为 docker 客户端在 kudu 中不可用。docker volume ls
在不知道数据实际存储在哪里的情况下,我在 azure 应用服务上运行容器感到不舒服,因为如果我决定将容器托管在其他地方,我可能必须备份文件。
我正在使用带有 1GB 存储空间的免费应用服务计划,因此希望利用它而不是装载 Azure 文件共享。另外,我知道但不想使用本地路径,因为我在这里问过它还有其他问题 - StackOverflow - Azure 应用服务多容器卷不起作用。WEBAPP_STORAGE_HOME
答:
使用 Docker 容器时,卷的存储由 Azure 存储管理。数据不会直接存储在基础虚拟机的文件系统上,因此无法直接从 Kudu 或应用服务环境中的 Docker 命令行访问它。
- 容器在访问持久性本地文件时可能会面临挑战,尤其是在应用服务重启时。
可能的解决方案:
请考虑使用 Docker 卷,而不是直接映射到 。它们更加灵活,可以在容器重启时处理存储。
${WEBAPP_STORAGE_HOME}
Docker Compose 仅确保 MySQL 容器在贝加尔湖之前启动。它不能保证MySQL服务器已完全初始化并准备好接受连接。
# Inside the "baikal" service definition
command: ["./wait-for-it.sh", "mysqldb:3306", "--", "your_actual_startup_command"]
考虑在贝加尔湖容器的启动脚本中使用类似 或 的工具,等待 MySQL 服务器准备好接受连接。wait-for-it
dockerize
wait-for-it.sh:
set -e
hostport=$1
shift
cmd="$@"
# Default values
timeout=15
use_ssl=0
# Parse command line options
while [ $# -gt 0 ]; do
case "$1" in
*:* )
hostport=$1
;;
-t )
timeout=$2
shift
;;
-s )
use_ssl=1
;;
-- )
shift
cmd="$@"
break
;;
* )
echo "Invalid argument: $1"
exit 1
;;
esac
shift
done
host=$(echo "$hostport" | cut -d: -f1)
port=$(echo "$hostport" | cut -d: -f2)
echo "Waiting for $host:$port to be ready..."
if [ "$use_ssl" -eq 1 ]; then
scheme="https://"
else
scheme="http://"
fi
timeout_cmd="timeout $timeout"
until $(curl --output /dev/null --silent --head --fail "$scheme$host:$port"); do
echo "Still waiting for $host:$port..."
sleep 1
$timeout_cmd 1 true || break
done
echo "$host:$port is available! Executing command: $cmd"
exec $cmd
评论
${WEBAPP_STORAGE_HOME}
如果有人也有同样的问题,请回答自己
我注意到,如果我保持应用程序服务运行(并且不让休眠),我就能够使用命名卷来持久保存数据。
但是在几天后回来并访问网络应用程序后,数据不再可用。这意味着卷存储在当前分配给/运行应用的主机中。无法通过 Kudu 或任何其他方式访问此卷。
如果 Azure 决定将应用移动到另一台计算机(显然没有卷),则数据将丢失。当我们停止应用服务一段时间并重新启动它时,会为应用服务分配一台新的主机。同样在我的情况下,尤其是在 F1 应用服务计划中,应用服务在一段时间不活动后关闭应用程序。
但是,我仍然建议对可能承受数据丢失的(突发)工作负载使用命名卷(如果由于某种原因绑定本地路径使用对您不起作用)。WEBAPP_STORAGE_HOME
评论