如何在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_CONFIG
在environment:
下的缩进无效,因为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文件中转义#?的主要内容,如果未能解决你的问题,请参考以下文章