Criei um servidor web em Go e tentei criar uma imagem docker para fins de aprendizado. Quando inicio a imagem docker, ela não detecta nenhuma variável de ambiente com "docker run", mas se eu iniciar "docker compose", consigo vê-las preenchidas, o que estou perdendo? Não entendi
principal.ir:
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
com docker run sem variáveis env
# docker run xxxx/mywebserver
Inizializziamo...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0f42e93ff038
HOME=/root
estou fazendo algo errado? Obrigado pela ajuda
A diferença de comportamento entre
docker run
edocker compose
é porque as variáveis de ambiente especificadas no seudocker-compose.yml
arquivo não são aplicadas automaticamente quando você usadocker run
. Elas são aplicadas somente quando você usadocker compose
para gerenciar seus contêineres.Por que isso acontece
docker compose
: Lê as variáveis de ambientedocker-compose.yml
e as passa para o contêiner quando ele inicia.docker run
: Não usadocker-compose.yml
. Se você quiser passar variáveis de ambiente, você deve especificá-las explicitamente usando o sinalizador--env
or-e
.Consertando para
docker run
Se você quiser replicar o comportamento de
docker compose
withdocker run
, você precisa passar as variáveis de ambiente manualmente. Por exemplo:Alternativamente, você pode definir as variáveis de ambiente em um
.env
arquivo e usar o--env-file
sinalizador comdocker run
. Exemplo:arquivo .env:
Comando:
Pontos-chave a serem lembrados
docker run
não lêdocker-compose.yml
: É por isso que você vê um comportamento diferente.-e
ou--env-file
para especificá-las.docker compose
configurações complexas : se sua configuração exigir vários serviços e variáveis de ambiente,docker compose
será mais fácil de gerenciar.O uso
docker compose
é recomendado para cenários como o seu, pois simplifica o processo de gerenciamento de aplicativos de vários contêineres.