我用 Go 创建了一个 Web 服务器,并尝试创建一个 docker 镜像用于学习。当我启动 docker 镜像时,它无法使用“docker run”检测到任何环境变量,但如果我启动“docker compose”,我可以看到它们被填充了,我错过了什么?我不明白
主要步骤:
func init() {
fmt.Println("Inizializziamo...")
cmd := exec.Command("env")
stdout, err := cmd.Output()
if err != nil {
fmt.Println(err.Error())
return
}
// Print the output
fmt.Println(string(stdout))
}
docker-compose.yml
services:
blog:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=db
- DB_PORT=5432
- DB_USER=test_user
- DB_PASSWORD=psw
- DB_NAME=mydb
- PORT=8080
depends_on:
- db
db:
image: postgres:15
restart: always
environment:
- POSTGRES_USER=test_user
- POSTGRES_PASSWORD=psw
- POSTGRES_DB=mydb
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
# docker compose run --rm blog env
[+] Creating 1/0
✔ Container mywebserver-db-1 Running 0.0s
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=154d98c6277d
TERM=xterm
DB_PASSWORD=psw
DB_NAME=mydb
PORT=8080
DB_HOST=db
DB_PORT=5432
DB_USER=test_user
HOME=/root
使用 docker run 时无需环境变量
# docker run xxxx/mywebserver
Inizializziamo...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0f42e93ff038
HOME=/root
我做错了吗?谢谢你的帮助
docker run
和之间的行为差异docker compose
是因为当您使用 时,文件中指定的环境变量docker-compose.yml
不会自动应用。它们仅在您使用来管理容器docker run
时才应用。docker compose
为什么会发生这种情况
docker compose
:在容器启动时读取环境变量docker-compose.yml
并将其传递给容器。docker run
:不使用docker-compose.yml
。如果要传递环境变量,则必须使用--env
或-e
标志明确指定它们。修复它
docker run
如果要复制
docker compose
with的行为docker run
,则需要手动传递环境变量。例如:或者,您可以在文件中定义环境变量
.env
并使用--env-file
带有的标志docker run
。例如:.env 文件:
命令:
要记住的要点
docker run
没有读docker-compose.yml
:这就是为什么你看到不同的行为。-e
或--env-file
来指定它们。docker compose
复杂的设置:如果您的设置需要多个服务和环境变量,docker compose
则更容易管理。对于像您这样的场景,建议使用
docker compose
,因为它简化了管理多容器应用程序的过程。