gpt4 book ai didi

docker - Dockerfile 中未设置环境变量

转载 作者:行者123 更新时间:2023-12-05 05:05:30 25 4
gpt4 key购买 nike

我有一个包含 2 个 Dockerfile 的项目,一个用于后端,一个用于数据库。 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 文件,该文件位于 src 文件夹中,与后端的 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

那么为什么要设置其他变量和连接字符串,而不是密码?如果我在数据库 Dockerfile 中将 ENV SA_PASSWORD=$SA_PASSWORD 替换为 ENV SA_PASSWORD=SomePassword,一切正常。

最佳答案

你根本不需要在 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-entrypoint.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

应用 docker 文件

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

关于docker - Dockerfile 中未设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60452791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com