Docker 组合两个应用程序初始化数据库

Docker Compose Two Applications Init DB

我有两个实体。 我的 asp.net 应用程序和从中获取数据的数据库。

我的 Docker 文件如下:

FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY bin/Debug/net6.0/ ./
COPY /DBinit.sql ./
COPY /entrypoint.sh ./
WORKDIR ./
ENTRYPOINT ["dotnet", "Server.dll"]
EXPOSE 80/tcp
RUN chmod +x ./entrypoint.sh
CMD /bin/bash ./entrypoint.sh

我的 entrypoint.sh 如下:

#!/bin/bash

set -e
run_cmd="dotnet run --server.urls http://*:80"

until dotnet ef database update; do
>&2 echo "SQL Server is starting up"
sleep 1
done

>&2 echo "SQL Server is up - executing command"
$run_cmd

sleep 30s
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Your_password123 -d master -i /DBinit.sql

而我的 Docker 撰写是:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:80"
    depends_on:
      - db
  db:
    image: "mcr.microsoft.com/mssql/server"
    environment:
      SA_PASSWORD: "Your_password123"
      ACCEPT_EULA: "Y"

我的申请 运行 正确。 server_db 和 server_web 都已启动。 我的问题是数据库本身是空的,我的 DBinit.sql 脚本没有被执行。

从我能看到的地方。我的问题是这个 DBinit.sql 文件没有被复制到 server_db 中。 如果我将server_web中的/打开ls -la。这个初始化脚本在那里(但它甚至不应该作为我的网络应用程序的一部分)

虽然我会在里面做同样的事情 server_db。里面没有 sql 脚本。 我对所有这些 Docker 实体感到非常困惑。

有人能告诉我解决方案吗?

您不能使用 asp.net 容器中的 /opt/mssql-tools/bin/sqlcmd。 我建议你做下一个:

  1. 为您的数据库创建单独的 Dockerfile(将其命名为 Dockerfile.db)并从您应用的 Dockerfile:
  2. 中删除相关内容
FROM mcr.microsoft.com/mssql/server
COPY /DBinit.sql /
COPY /db_entrypoint.sh /
WORKDIR /
# you may chmod db_entrypoint.sh on your host system so you will not need this line at all
RUN chmod +x /db_entrypoint.sh
ENTRYPOINT /db_entrypoint.sh & /opt/mssql/bin/sqlservr
  1. 将与数据库相关的内容移动到另一个入口点(我们将其命名为 db_entrypoint.sh):
#!/bin/bash
sleep 30s
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -d master -i /DBinit.sql

(注意我已经用环境变量替换了 Your_password123

  1. 准备好你的 docker-compose.yml:
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:80"
    depends_on:
      - db
  db:
    build:
      context: .
      dockerfile: Dockerfile.db
    environment:
      SA_PASSWORD: "Your_password123"
      ACCEPT_EULA: "Y"

就是这样。检查一下——现在您可以成功初始化您的数据库