Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 不接受Dockerfile环境变量_Postgresql_Docker_Dockerfile - Fatal编程技术网

Postgresql 不接受Dockerfile环境变量

Postgresql 不接受Dockerfile环境变量,postgresql,docker,dockerfile,Postgresql,Docker,Dockerfile,我正在使用docker和dockerfile构建图像。我想构建一个PostgreSQL映像,因此我使用此dockerfile: ARG POSTGRES_USER=vetouz ARG POSTGRES_PASSWORD=*** ARG POSTGRES_DB=vetouz_mediatheque FROM postgres:latest USER postgres EXPOSE 5432 然后,我使用这个命令运行图像 docker run -e POSTGRES_PASSWORD=ve

我正在使用docker和dockerfile构建图像。我想构建一个PostgreSQL映像,因此我使用此dockerfile:

ARG POSTGRES_USER=vetouz
ARG POSTGRES_PASSWORD=***
ARG POSTGRES_DB=vetouz_mediatheque

FROM postgres:latest

USER postgres

EXPOSE 5432
然后,我使用这个命令运行图像

docker run -e POSTGRES_PASSWORD=vetouz -d --name postgres postgres:latest
当我这样做时,角色
vetouz
,密码和db
vetouz_mediatheque
不会被创建,我不明白为什么。我知道这一点,因为当我使用
sudocker exec-it postgres bash
访问我的容器,然后运行
psql-U vetouz
时,我得到的错误是
角色vetouz不存在

如果我使用以下命令运行映像,它将起作用:

docker run -e POSTGRES_PASSWORD=*** -e POSTGRES_USER=vetouz -e POSTGRES_DB=vetouz_mediatheque -d --name postgres postgres:latest
但我宁愿在dockerfile中定义变量


知道它为什么不工作吗?

请使用
ENV
而不是
ARG
。参数仅在生成期间可用,环境也在运行时可用

来源


请使用
ENV
而不是
ARG
。参数仅在生成期间可用,环境也在运行时可用

来源

你的问题 如前所述,您正在使用仅在构建Docker映像时可用的
ARG
,但使用
env
变量在Docker映像中设置敏感信息不是一种安全的方法,我将解释原因

安全问题 但我宁愿在dockerfile中定义变量

对于不敏感的信息,这是可以的,但对于密码等敏感信息,这不是最佳做法,因为数据库凭据将以纯文本形式存储在docker文件中,即使使用
ARG
设置
ENV
var,它们也将在docker图像层中可用

docker run-e POSTGRES_PASSWORD=***-e POSTGRES_USER=vetouz-e POSTGRES_DB=vetouz_mediatehque-d--名称POSTGRES POSTGRES:latest

这在安全性方面也是一种不好的做法,因为现在数据库凭据被保存到bash历史记录中

在Linux机器中,您可以通过以下方式进行检查:

history | grep-i POSTGRES
更安全的方法 创建一个.env文件:
POSTGRES_USER=vetouz
POSTGRES_PASSWORD=your-password-here
POSTGRES_DB=vetouz_mediatheque
不要忘记将
.env
文件添加到
.gitignore

echo.env>>.gitignore
运行Docker容器 现在使用以下命令运行docker容器:

docker run--env file./.env-d--name postgres postgres:latest
您的问题 如前所述,您正在使用仅在构建Docker映像时可用的
ARG
,但使用
env
变量在Docker映像中设置敏感信息不是一种安全的方法,我将解释原因

安全问题 但我宁愿在dockerfile中定义变量

对于不敏感的信息,这是可以的,但对于密码等敏感信息,这不是最佳做法,因为数据库凭据将以纯文本形式存储在docker文件中,即使使用
ARG
设置
ENV
var,它们也将在docker图像层中可用

docker run-e POSTGRES_PASSWORD=***-e POSTGRES_USER=vetouz-e POSTGRES_DB=vetouz_mediatehque-d--名称POSTGRES POSTGRES:latest

这在安全性方面也是一种不好的做法,因为现在数据库凭据被保存到bash历史记录中

在Linux机器中,您可以通过以下方式进行检查:

history | grep-i POSTGRES
更安全的方法 创建一个.env文件:
POSTGRES_USER=vetouz
POSTGRES_PASSWORD=your-password-here
POSTGRES_DB=vetouz_mediatheque
不要忘记将
.env
文件添加到
.gitignore

echo.env>>.gitignore
运行Docker容器 现在使用以下命令运行docker容器:

docker run--env file./.env-d--name postgres postgres:latest