我正在尝试将 demo nodejs + reactjs + postgresql应用程序容器化,目录结构如下所示:
demo:
-client
-.env
- Dockerfile.client
- package.json
-server
- .env
- Dockerfile.server
- package.json
.env
docker-compose.yml
docker-compose.yml
version: '3.8'
services:
client:
container_name: ${APP_NAME}_fe
build:
dockerfile: ./client/Dockerfile.client
environment:
CHOKIDAR_USEPOLLING: "true"
image: ${APP_NAME}_img_fe
volumes:
- ./client:/app
- /app/node_modules
ports:
- 3000:3000
server:
container_name: ${APP_NAME}_be
build:
# context: .
dockerfile: ./server/Dockerfile.server
image: ${APP_NAME}_img_be
volumes:
- ./server:/app
- /app/node_modules
ports:
- 5000:5000
db:
container_name: ${APP_NAME}_db
image: postgres
build:
# context: .
dockerfile: ./server/Dockerfile.db
env_file: ./server/.env
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USER}
POSTGRES_DB: ${APP_NAME}
volumes:
- db-data:/var/lib/postgresql/data
ports:
- 5432:5432
volumes:
db-data:
name: ${APP_NAME}_db
我试图将所有敏感数据(如密码和密钥),api url或端口保存在.env文件中,因此我将所有信息都放在一个地方,就像这样:
.env来自服务器
PORT=5000
DB_PASSWORD=postgres
DB_USER=postgres
DB_NAME=demo
.env在根级别
APP_NAME=demo
问题在于数据库服务(postgres容器)的凭据在创建时不可见,因此我需要像这样对它们进行硬编码:
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: demo
是否可以从.env文件内部获取这些值?
LE:我认为一种方法是使用以下方法在应用程序的根目录中仅保留一个.env: -db密码 -db用户 -端口(服务器和客户端) -api网址
在这种情况下,我需要从客户端和服务器文件夹访问.env。
不确定这是否是常见做法。
谢谢。
答案 0 :(得分:0)
您不需要从应用程序访问.env文件。您只需在正确的文件夹中运行1.0.0-alpha4
,即可在docker-compose.yml解析上下文中替换变量。
您遇到的问题可能是因为您在项目中分布了多个.env文件,它们的值不同。
如果您有多个环境变量,则可以通过提供环境变量文件的路径来替换它们。 默认情况下,docker-compose命令将在运行命令的目录中查找名为
docker-compose up
的文件。通过将文件作为参数传递,您可以将其存储在任何位置并命名适当地,例如.env.ci,.env.dev,.env.prod。使用--env-file选项传递文件路径:
这意味着不仅要保留.env文件是一个好习惯,而且您可能应该只保留一个.env
文件,然后从保存该文件的文件夹中运行.env
命令(通常项目的根文件夹)。
答案 1 :(得分:-1)
在我看来,在您的环境中,“-”这个符号丢失了。这样吧
environment:
- POSTGRES_PASSWORD: ${DB_PASSWORD}
- POSTGRES_USER: ${DB_USER}
- POSTGRES_DB: ${APP_NAME}
并将docker-compose.yaml和.env文件保存在同一目录下,然后尝试
docker-compose up -d
我总是使用-d作为后台作业,守护程序线程启动。
您还可以在此链接中查看Postgres的环境变量列表: