【问题标题】:Error passing docker secrets to azure web app 'No such file or directory: '/run/secrets/'将 docker 机密传递给 azure Web 应用程序时出错'没有这样的文件或目录:'/run/secrets/'
【发布时间】:2019-08-16 18:13:46
【问题描述】:

我对 Docker 比较陌生,目前正在构建一个多容器 dockerized azure web 应用程序(在烧瓶中)。但是,我在秘密管理方面遇到了一些困难。我已经成功构建了一个通过环境变量存储应用程序机密的版本。但根据最近的一些阅读,我注意到这不是一个好主意。我一直在尝试更新我的应用程序以使用 Docker Secrets,但没有运气。

我已经根据这篇帖子成功创建了秘密:

how do you manage secret values with docker-compose v3.1?

我已经部署了堆栈并验证了 /run/secrets/ 中的两个容器中的机密都可用。但是,当我在 azure 中运行应用程序时出现错误。

这是我在 azure 中启动应用程序所采取的步骤。

docker swarm init --advertise-addr XXXXXX
$ echo "This is an external secret" | docker secret create my_external_secret 
docker-compose build
docker push
docker stack deploy -c *path-to*/docker-compose.yml  webapp

接下来我将重新启动 azure web 应用以提取最新图像

docker-compose 的基本结构如下。

version: '3.1'
services:
  webapp:
    build: .
    secrets:
      - my_external_secret
    image: some_azure_registry/flask_site:latest

  celery: 
    build: .
    command: celery worker -A tasks.celery --loglevel=INFO -P gevent
    secrets:
      - my_external_secret
    image: some_azure_registry.azurecr.io/flask_site_celery:latest


secrets:                        # top level secrets block
    - my_external_secret
      external: true

但是,当我在 azure 中运行应用程序时,我得到:

没有这样的文件或目录:'/run/secrets/my_external_secret

我可以在容器上附加一个外壳并成功运行:

python
open('/run/secrets/*my_external_secret*', 'r').read().strip()

但是,当 webapp 执行上述行时,它会失败并出现无文件或目录错误。任何帮助将不胜感激。

【问题讨论】:

    标签: azure docker-compose azure-web-app-service docker-swarm docker-secrets


    【解决方案1】:

    很遗憾,Azure Web App for Container 不支持 docker-compose 顶层的密钥。往下看:

    支持的选项

    • 命令
    • 入口点
    • 环境
    • 图片
    • 端口
    • 重启
    • 服务

    不支持的选项

    • 构建(不允许)
    • depends_on(忽略)
    • 网络(忽略)
    • 秘密(忽略)
    • 80 和 8080 以外的端口(忽略)

    更多详情请见Docker Compose options

    【讨论】:

    • 感谢您的回复。我想下一个问题是,在 dockerized azure web-apps 中存储秘密的首选方法是什么?
    • @UCAB 据我所知,docker 文件或 Azure Web App 应用程序设置中的环境变量是最简单的。但是您也可以将机密存储在 Azure Keyvault 中并在代码中获取它们。
    • 目前我正在使用 Azure Keyvault 进行端到端加密。我试图通过 Docker Secrets 传递的两个变量(但失败了)是tenant_id 和 vault_secret_id。使用 Docker Secrets 的全部意义在于将这样的秘密保留在环境之外。也许我遗漏了一些东西,但是如果攻击者获得了对环境变量的访问权限,那么他们就可以访问我的保管库机密,这或多或少违背了保管库的目的。我知道还有几个步骤,但为保管库混淆这些 ID 似乎是一种好习惯。
    猜你喜欢
    • 2022-01-21
    • 2023-02-02
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多