我在 docker compose 文件中有一个 postgres 服务。但是,此服务并非直接基于 postgres 映像。它基于在 postgres 映像上构建的 dockerfile。
docker compose 中的这项服务采用常见的环境键,如 POSTGRES_USER 等
environment:
POSTGRES_USER: ${MYUSER}
我想在docker-entrypoint-initdb.d
通过 heredoc 编写的初始化脚本中使用 POSTGRES_USER。但是不行。例如:
# near top of docker file
ARG MYDB
...
# later on in file
COPY <<EOF /docker-entrypoint-initdb.d/setup.sh
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$MYDB" <<-EOSQL
...
EOSQL
EOF
当容器运行时,我发现它没有值,但是正如我所使用,POSTGRES_USER
它有一个值。MYDB
ARG MYDB
我不知道如何设置一个等效值ENV POSTGRES_USER
,它似乎需要在 vscode 中提供一个值,但这已经在撰写文件中完成了?
答案1
当 BuildKit 读取COPY
指令时,文件的内容会得到全面评估。
此时,您的变量没有值 a'd,因此会扩展为 ``,而不是留下未扩展的$POSTGRES_USER
。
从您所展示的内容来看,我认为将数据库名称作为构建时参数没有任何意义;只需在入口点根据需要初始化数据库,而无需对其名称进行半硬编码。
否则,只需转义您不想在文件中扩展的变量。