O aplicativo Next.js agrupa as variáveis env durante o tempo de construção. É por isso que preciso passar variáveis env como args e usá-las durante o estágio de construção. Agora, como parte do pipeline CD/CI, quero passar args dinamicamente por meio de variáveis de ambiente declaradas em compose.yaml. No entanto, a variável env do arquivo compose não é lida durante o tempo de construção. Na verdade, o terminal imprime a seguinte mensagem:
time="2024-12-12T23:35:10-05:00" level=warning msg="A variável "NEXT_PUBLIC_GRAPHQL_SERVER" não está definida. Padrão para uma string em branco."
Compor.yaml
services:
frontend:
build:
context: ./frontend
args:
- NEXT_PUBLIC_GRAPHQL_SERVER=${NEXT_PUBLIC_GRAPHQL_SERVER}
env_file:
- ./frontend/.env
environment:
NODE_ENV: production
NEXT_PUBLIC_GRAPHQL_SERVER: http://localhost:3000/
ports:
- 8080:8080
arquivo docker:
FROM base AS builder
WORKDIR /usr/src/app
COPY --from=deps /usr/src/app/node_modules ./node_modules
COPY . .
ARG NEXT_PUBLIC_GRAPHQL_SERVER
ENV NEXT_PUBLIC_GRAPHQL_SERVER=${NEXT_PUBLIC_GRAPHQL_SERVER}
RUN npm run build
Tudo funciona bem quando defino explicitamente a variável env em args, mas esse não é o fluxo de trabalho desejado.
services:
frontend:
build:
context: ./frontend
args:
- NEXT_PUBLIC_GRAPHQL_SERVER=http://localhost:3000/
Você precisa distinguir entre os ambientes que está preparando para a compilação, para o tempo de execução do contêiner e para o próprio Compose.
O Docker Compose, quando analisa o arquivo compose.yml pela primeira vez, não usa a
env_file:
diretiva ${VAR} para expandir nenhuma no compose.yml - essa diretiva é para injetar variáveis em contêineres.Dessa forma, o próprio ambiente do Docker é a fonte das variáveis: um
.env
arquivo na mesma pasta que o compose.yml, quaisquer variáveis de ambiente que são exportadas antes da execução do Docker Compose são as fontes para expansão de variáveis no compose.yml.