Azure 应用服务容器 命名卷存储在哪里?

Azure App Service Containers where are named volumes stored?

提问人:Manthan 提问时间:11/16/2023 最后编辑:Manthan 更新时间:11/17/2023 访问量:60

问:

我正在尝试使用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_STORAGEtrue

但是我无法找到文件系统上存储的卷的确切位置(我通过 Kudu 中的 bash shell 搜索)。我四处寻找(甚至在/home目录之外),但找不到它们。我无法运行,因为 docker 客户端在 kudu 中不可用。docker volume ls

在不知道数据实际存储在哪里的情况下,我在 azure 应用服务上运行容器感到不舒服,因为如果我决定将容器托管在其他地方,我可能必须备份文件。

我正在使用带有 1GB 存储空间的免费应用服务计划,因此希望利用它而不是装载 Azure 文件共享。另外,我知道但不想使用本地路径,因为我在这里问过它还有其他问题 - StackOverflow - Azure 应用服务多容器卷不起作用WEBAPP_STORAGE_HOME

docker-compose azure-web-app-service docker-volume

评论


答:

0赞 Suresh Chikkam 11/17/2023 #1

使用 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-itdockerize

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

评论

0赞 Manthan 11/20/2023
我的订阅中没有任何活动的 Azure 存储帐户 - 因此我不知道 Azure 将命名卷存储在哪里。在官方文档中,他们建议用于存储持久性文件(没有给出命名卷的示例)。但是,由于命名卷在应用服务中工作,我想知道它们的实际存储位置。我知道容器启动时间可能不同(贝加尔湖可能在MySQL之前启动),但这不是我的问题。${WEBAPP_STORAGE_HOME}
0赞 Manthan 11/27/2023 #2

如果有人也有同样的问题,请回答自己

我注意到,如果我保持应用程序服务运行(并且不让休眠),我就能够使用命名卷来持久保存数据。

但是在几天后回来并访问网络应用程序后,数据不再可用。这意味着卷存储在当前分配给/运行应用的主机中。无法通过 Kudu 或任何其他方式访问此卷。

如果 Azure 决定将应用移动到另一台计算机(显然没有卷),则数据将丢失。当我们停止应用服务一段时间并重新启动它时,会为应用服务分配一台新的主机。同样在我的情况下,尤其是在 F1 应用服务计划中,应用服务在一段时间不活动后关闭应用程序。

但是,我仍然建议对可能承受数据丢失的(突发)工作负载使用命名卷(如果由于某种原因绑定本地路径使用对您不起作用)。WEBAPP_STORAGE_HOME