У меня есть проект с 2 Dockerfiles, один для бэкенда и один для базы данных. Докер-файлы находятся в отдельных папках. Я создаю два изображения с помощью файла docker -compose.yml, который выглядит следующим образом:
version: "3.7"
services:
dotnet-backend:
container_name: dotnet-backend
build: .
env_file: .env
links:
- mssql-db
ports:
- "8000:80"
mssql-db:
container_name: mssql-db
build: ./Database
env_file: .env
volumes:
- ./Database/:/scripts/
ports:
- "1433:1433"
expose:
- "1433"
command:
- /bin/bash
- -c
- |
/opt/mssql/bin/sqlservr &
sleep infinity
Как видите, я использую файл .env для переменных среды, этот файл находится в папка sr c, такая же, как Dockerfile для бэкэнда и остальной части кода бэкенда.
Это мой Dockerfile для бэкэнда:
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Debug -o out MyProject.csproj
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
WORKDIR /app
COPY --from=build-env /app/out .
EXPOSE 80
ENV ASPNETCORE_ENVIRONMENT=$ASPNETCORE_ENVIRONMENT
ENTRYPOINT ["dotnet", "MyProject.dll"]
Это мой Dockerfile для базы данных (находится в ./Database):
FROM mcr.microsoft.com/mssql/server:2017-latest
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=$SA_PASSWORD
ENV MSSQL_PID=Developer
ENV MSSQL_TCP_PORT=1433
WORKDIR /src
COPY ./ /scripts/
EXPOSE 1433
RUN (/opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" && sleep 5s && (for foo in /scripts/*.sql;do /opt/mssql-tools/bin/sqlcmd -S127.0.0.1 -Usa -P$SA_PASSWORD -i$foo;done)
И, наконец, мой файл .env:
SA_PASSWORD=SomePassword
ASPNETCORE_ENVIRONMENT=Development
ConnectionStrings__My_db=Data Source=tcp:mssql-db,1433;Initial Catalog=DevDB;User ID=sa;Password=SomePassword
Странно, что переменная ASPNETCORE_ENVIRONMENT установлена, как я могу сказать, протестировав мой API, который он работает в режиме разработки, и строка подключения из файла .env также устанавливается, поскольку мой API может подключаться к моей базе данных, когда я вручную ввожу пароль. Но переменная окружения SA_PASSWORD не устанавливается. Вот вывод команды docker -compose up --build:
Так почему же устанавливаются другие переменные и строки подключения, а не пароль? Все отлично работает, если я заменю ENV SA_PASSWORD=$SA_PASSWORD
на ENV SA_PASSWORD=SomePassword
в базе данных Dockerfile.