Переменная среды не устанавливается в Dockerfile - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть проект с 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:

enter image description here

Так почему же устанавливаются другие переменные и строки подключения, а не пароль? Все отлично работает, если я заменю ENV SA_PASSWORD=$SA_PASSWORD на ENV SA_PASSWORD=SomePassword в базе данных Dockerfile.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

вам вообще не нужно устанавливать переменные env в docker изображениях, и вы можете решить эту проблему, используя следующие изменения

ASPNETCORE_ENVIRONMENT работает, потому что приложение только проверить это во время выполнения, а не во время сборки

база данных docker файл

FROM mcr.microsoft.com/mssql/server:2017-latest

ENV ACCEPT_EULA=Y
ENV MSSQL_PID=Developer
ENV MSSQL_TCP_PORT=1433

WORKDIR /src
COPY ./ /scripts/

EXPOSE 1433 

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

docker -входная точка. sh (chmod a + x)

#!/bin/bash -e


(/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)

exec "$@"

exit 0

app docker file

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

ENTRYPOINT ["dotnet", "MyProject.dll"]

Вы также можете переместить их в файл env, рекомендуется разделить файлы env для контейнеров

ENV ACCEPT_EULA=Y
ENV MSSQL_PID=Developer
ENV MSSQL_TCP_PORT=1433
0 голосов
/ 28 февраля 2020

Это недопустимый способ взять переменную из окружения.

Переменная $ SA_PASSWORD в Dockerfile на самом деле является переменной в области видимости Dockerfile и времени создания образа.

У переменной нет значения, поскольку способ ее назначения - через команду ARG (https://docs.docker.com/engine/reference/builder/#arg).

В любом случае, если вам нужно объявить SA_PASSWORD и прочитать его из среды во время выполнения контейнера, вы должны сделать это через ENTRYPOINT. ENTRYPOINT выполняется при запуске контейнера.

...