【问题标题】:"key cannot contain a space" error while running docker compose运行 docker compose 时出现“键不能包含空格”错误
【发布时间】:2021-11-29 09:33:28
【问题描述】:

我正在尝试使用 dockerfile 将我的 django 应用程序部署到应用程序引擎,为此,在关注了一些博客(例如 these)之后,我创建了一个 docker-compose.yml 文件,但是当我运行 docker compose up 命令或 @ 987654323@ 我收到错误key cannot contain a space。见下文:

例如:

$ docker compose up

key cannot contain a space
$ cat docker-compose.yml 

version: '3.7'

services:
  app:
    build:
      context: .
    ports: ['8000:8000']
    volumes: ['./app:/app']

有人可以帮我解决这个错误吗?我已经尝试 yamlint 来验证 yaml 文件中是否存在任何空格/缩进类型的错误,但它没有向我显示任何错误。

编辑: 以下是较长命令中文件的内容:

version: '3.7'

services:
  gcloud:
    image: google/cloud-sdk:338.0.0
    volumes:
      - gcp-creds:/creds
      - .:/app
    working_dir: /app
    environment:
      - CLOUDSDK_CONFIG=/creds

volumes:
  gcp-creds:

【问题讨论】:

  • 有人可以帮忙吗?
  • 您显示的较长的docker-compose run --rm cloud ... 命令似乎与此 Compose 文件不匹配;是否有更完整的文件来演示该错误?您显示的文件在语法上似乎很好。
  • 您能否显示完整的错误消息,与显示的完全一样?还要确保您发布的 YAML 与您正在使用的 YAML 完全相同,尤其是关于制表符(在 YAML 中不是缩进)。
  • @flyx 错误消息是完整的错误消息 :( 这就是我得到的全部,我没有发现 yaml 文件有任何问题。此外,yaml 文件的语法与我在这里发布的相同.
  • @David,根据我分享的博客链接中提到的内容,我正在尝试更长的命令,这是部署应用程序的最终命令,但是,该命令也显示相同的错误。是不是因为我在 macos 上运行这些命令而某些设置不正确?如果有帮助,我也会发布更长的命令文件“docker-compose-deploy.yml”内容。

标签: docker docker-compose yaml dockerfile djangoappengine


【解决方案1】:

好的,终于解决了!经过一番折腾,我终于可以通过以下操作解决此问题:

  1. 从我的 docker 桌面设置中取消选中使用“Docker Compose v2”的选项。 Here is the setting in Docker Desktop

  2. 关闭 docker 桌面应用并重新启动它。

如果您遇到问题,请尝试这些步骤。谢谢!

【讨论】:

  • 对我不起作用,尽管多次重复尝试。目前回滚到版本 4.0.1
  • 你尝试过用破折号“docker-compose up”吗?在此处阅读有关 docker-compose 两个版本的更新:docs.docker.com/compose/cli-command
  • 它对我有用
  • @suman 感谢您告诉我。我对 SO 的第一个解决方案 :)
  • @xis10z - 是的,我尝试过并阅读了发行说明?‍♂️ 我总是害怕来自 Docker Desktop 的更新!不过我会再试一次。谢谢
【解决方案2】:

只是在此处添加另一个替代答案,我确认按照上述步骤对我有用,但没有。我的情况略有不同,但当谷歌首先把我带到这里时,我想我会留下一个便条。

检查您的环境变量值是否有空格!

这可能仅在您使用env_var 文件时适用(感谢 OP 不在最小示例中,因此说这是不同的)。 变量中未转义的空格会导致这个神秘的错误消息。

所以,给定一个这样的 compose 文件:

version: '3.7'

services:
  gcloud:
    image: google/cloud-sdk:338.0.0
    volumes:
      - gcp-creds:/creds
      - .:/app
    working_dir: /app
    env_file:
      - some_env_file.env

如果some_env_file.env 看起来像这样:

MY_VAR=some string with spaces

然后我们得到神秘的密钥不能包含空格。

如果我们将some_env_file.env 改为这样:

MY_VAR="some string with spaces"

那么一切都很好。

The issue has been reported to docker-compose.

谷歌首先把我带到这里,当你的建议很遗憾对我不起作用时,它把我带到了this reddit thread,在那里我发现了上述情况。

【讨论】:

  • 这是正确的答案!我猜在 docker-compose v2 和 v1 之间,他们开始检查 .env 文件中的值格式
【解决方案3】:

Docker Compose(至少从 v2 开始)在处理 docker-compose.yml 文件之前自动解析 .env 文件,而不管 yaml 文件中的任何 env_file 设置。如果您的.env 文件中的任何变量包含空格,那么您将收到错误key cannot contain a space。

目前有两种解决方法:

  1. 将您的 .env 文件重命名为其他名称,或
  2. 创建一个备用/空.env 文件,例如.env.docker,然后显式设置--env-file参数,即docker compose --env-file .env.docker config。

在此处跟踪相关问题:

  1. https://github.com/docker/compose/issues/6741
  2. https://github.com/docker/compose/issues/8736
  3. https://github.com/docker/compose/issues/6951
  4. https://github.com/docker/compose/issues/4642
  5. https://github.com/docker/compose/commit/ed18cefc040f66bb7f5f5c9f7b141cbd3afbbc89
  6. https://docs.docker.com/compose/env-file/

【讨论】:

    【解决方案4】:

    还有一点需要注意 - 从 Compose V2 开始,如果 Compose 使用的 env 文件中有内联 cmets,则可能会引发此错误。例如

    ---
    version: "3.7"
    
    services:
      backend:
        build:
          context: .
          dockerfile: Dockerfile
        env_file: .app.env
    

    而.app.env是这样的

    RABBIT_USER=user  # RabbitMQ user
    

    可能会发生同样的错误。要修复,只需将评论移到自己的行

    # RabbitMQ user
    RABBIT_USER=user
    

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2021-08-27
      • 2021-12-28
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多