如何在docker文件中转义#?

Posted

技术标签:

【中文标题】如何在docker文件中转义#?【英文标题】:How to escape # in docker file? 【发布时间】:2020-12-07 13:47:21 【问题描述】:

我有一个 docker compose 文件如下:

    version: '3'
    services:
    prisma:
        image: prismagraphql/prisma:1.34.10
        restart: always
        ports:
        - '4466:4466'
        environment:
        PRISMA_CONFIG: |
            port: 4466
            databases:
            default:
                connector: mysql
                host: test.mysql.database.azure.com
                database: default@default
                user: rie@dak-prod
                password: ak123#$
                ssl: false
                rawAccess: true
                port: '3306'
                migrations: true

当我尝试命令 docker-compose up -d 时,命令失败并出现错误:

ERROR: Invalid interpolation format for "environment" option in service "prisma": "port: 4466
databases:
default:
    connector: mysql
    host: est.mysql.database.azure.com
    database: default@default
    user: rie@dak-prod
    password: ak123#$
    ssl: false
    rawAccess: true
    port: '3306'
    migrations: true
"

我确定的原因是密码中的#。如果# 不存在,则不会抛出此错误。如何转义(使用)散列 docker compose 文件?

【问题讨论】:

【参考方案1】:

我认为问题不在于#,而在于$ 符号。

当您的配置需要文字美元符号时,您可以使用$$(双美元符号)。这也可以防止 Compose 插入值,因此 $$ 允许您引用您不希望 Compose 处理的环境变量。

所以在你的情况下ak123#$ 必须写成ak123#$$

Reference documentation

【讨论】:

【参考方案2】:

引用您的字符串以包含special characters in yaml,如#,并使用第二个美元符号将美元符号转义为prevent docker-compose from expanding it:

password: "ak123#$$"

【讨论】:

【参考方案3】:

最好的使用方式是 base64 编码功能。将您的密码转换为 base64 并尝试。应该可以。

这样

echo "ak123#$" | base64

以及任何输出用作您的密码和更安全的方式

【讨论】:

【参考方案4】:

您的docker-compose.yml 有两个问题:

$ 应使用 $$ 转义,正如 @Suhail Gupta's answer 和 docs 所指出的那样:

当您的配置需要文字美元符号时,您可以使用 $$(双美元符号)

PRISMA_CONFIGenvironment: 下的缩进无效,因为PRISMA_CONFIG 应该是environment 的子元素

你应该使用类似的东西:

    environment:
      # proper indentation to have PRISMA_CONFIG part of environment
      PRISMA_CONFIG: |
          port: 4466
          databases:
          default:
              connector: mysql
              host: test.mysql.database.azure.com
              database: default@default
              user: rie@dak-prod
              # double $ to have a literal '$'
              password: ak123#$$
              ssl: false
              rawAccess: true
              port: '3306'
              migrations: true

【讨论】:

以上是关于如何在docker文件中转义#?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pandoc 在书目参考中转义“:”?

如何在 String.Format 中转义 %?

如何在 bash 循环列表中转义空格?

如何在别名中的 awk 命令中转义字段变量?

如何在 MSBuild 的 Exec 命令中转义引号

如何在 maven pom 属性值中转义“&”[重复]