Azure应用服务容器存储命名卷的位置?

suzh9iv8  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图托管一个带有MySQL后端的CalDAV服务器(Baikal)-但问题与这些图像无关。我的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 volume ls,因为Docker客户端在Kudu中不可用。
在azure应用服务上运行容器,我不知道数据实际存储在哪里,因为如果我决定在其他地方托管容器,我可能需要备份文件。
我正在使用一个免费的应用程序服务计划,该计划附带1GB的存储空间,因此希望利用这个而不是安装Azure文件共享。此外,我知道WEBAPP_STORAGE_HOME,但不想使用本地路径,因为我在这里询问了其他问题-StackOverflow - Azure App Service multi containers volume not working

b5buobof

b5buobof1#

使用Docker容器时,卷的存储由Azure Storage管理。数据不会直接存储在底层虚拟机的文件系统上,并且您无法直接从Kudu或App Service环境中的Docker命令行访问它。

  • 容器在访问持久本地文件时可能会遇到挑战,尤其是在应用服务重新启动时。

可能的解决方案:

  • 不要直接Map到${WEBAPP_STORAGE_HOME},考虑使用Docker卷。它们更灵活,可以在容器重启时处理存储。
  • Docker Compose只确保MySQL容器在Baikal之前启动。它不保证MySQL服务器完全初始化并准备好接受连接。
# Inside the "baikal" service definition
command: ["./wait-for-it.sh", "mysqldb:3306", "--", "your_actual_startup_command"]

字符串
考虑在Baikal容器的启动脚本中使用wait-for-itdockerize等工具,以等待MySQL服务器准备好接受连接。

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

相关问题