Estou um pouco confuso com o comportamento da variável de ambiente $PATH
dentro de um contêiner Docker.
- Estou tentando definir a variável $PATH como
/kdb/bin
, mais alguns outros valores. - Em vez disso, o valor da
$PATH
variável parece estar definido como o mesmo valor do sistema host do Docker Container
O valor de echo $PATH
no host é:
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
(Além de algumas outras coisas que omiti por questões de brevidade.)
Aqui está o meu Dockerfile
:
FROM ubuntu:24.04
WORKDIR /kdb
ENV QHOME=/kdb
ENV PATH="${QHOME}/bin:${QHOME}:$PATH"
ENV QLIC=/kdb/kc.lic
COPY ./q q
COPY ./bin bin
COPY ./src src
CMD ["/bin/bash", "-c", "sleep infinity"]
e odocker-compose.yml
services:
kdb:
container_name: kdb
build: .
command: echo $PATH
ports:
- 5000:5000
Defini o comando padrão em para docker-compose.yml
ser echo $PATH
, de modo que o valor de PATH
será mostrado nos logs.
docker logs
mostra que o mesmo valor do host está sendo usado dentro do contêiner. A PATH
variável Container não inclui /kdb/bin
or /kdb
.
Por que isso acontece?
Porque o Compose substitui referências de variáveis de ambiente antes de fazer seu processamento. Isso é um pouco mais comumente usado em outras partes do arquivo (por exemplo, para substituir a tag de imagem ou fornecer uma porta de host configurável).
A outra complicação aqui é que o Compose
command:
não executa um shell automaticamente, diferentemente do DockerfileCMD
. Você precisa fornecer um shell você mesmo. Então você precisa escrevercom um
sh -c
wrapper explícito e escapando do cifrão.Há uma maneira mais fácil de fazer isso, no entanto, especialmente enquanto você está depurando. Você pode criar
docker-compose run
um contêiner com base em uma especificação do Compose, mas substituindo ocommand:
ou DockerfileCMD
por algo que você digita na linha de comando.Então você pode deletar a
command:
substituição no arquivo Compose. Já que você pode facilmente iniciar um shell interativo se precisar, também faça o DockerfileCMD
executar a coisa que você normalmente quer que o container execute, provavelmente algo comoCMD ["kdb"]
; não há razão para ter um container executando umsleep
comando sem sentido.