从 dockerfile 内部获取已在 docker compose 文件中设置的环境变量

从 dockerfile 内部获取已在 docker compose 文件中设置的环境变量

我在 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它有一个值。MYDBARG MYDB

我不知道如何设置一个等效值ENV POSTGRES_USER,它似乎需要在 vscode 中提供一个值,但这已经在撰写文件中完成了?

答案1

当 BuildKit 读取COPY指令时,文件的内容会得到全面评估。

此时,您的变量没有值 a'd,因此会扩展为 ``,而不是留下未扩展的$POSTGRES_USER

从您所展示的内容来看,我认为将数据库名称作为构建时参数没有任何意义;只需在入口点根据需要初始化数据库,而无需对其名称进行半硬编码。

否则,只需转义您不想在文件中扩展的变量。

相关内容