É porque você está definindo as variáveis de ambiente no docker-compose.yml , mas tentando referenciá-las no tempo de compilação (também conhecido como RUN env ). Essas variáveis só estarão disponíveis depois que a imagem for criada, no comando ENTRYPOINT / CMD .
Você precisa definir variáveis no tempo de compilação usando o comando ENV no Dockerfile ou usar as variáveis depois que o contêiner tiver sido iniciado (de qualquer forma, tudo bem no seu caso).
Para referenciar o db no serviço da web, você precisa criar uma rede personalizada ( link ) e defina o alias do domínio interno ou faça referência ao primeiro contêiner ao segundo usando links de serviço ( link ). O segundo parece mais apropriado no seu caso, uma vez que o serviço db não precisará referenciar o serviço da web.