【问题标题】:Docker Compose Two Applications Init DBDocker Compose 两个应用程序 Init DB
【发布时间】:2021-09-23 07:47:19
【问题描述】:

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

我的 Dockerfile 如下:

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 Compose 是:

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 实体感到非常困惑。

有人能给我指出一个解决方案吗?

【问题讨论】:

    标签: sql-server docker docker-compose yaml


    【解决方案1】:

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

    1. 为您的数据库创建单独的Dockerfile(将其命名为Dockerfile.db)并从您应用的Dockerfile 中删除相关内容:
    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 相关的内容移动到另一个入口点(我们将其命名为 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 替换为 env 变量)

    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"
    

    就是这样。看看——现在你可以成功地初始化你的数据库了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2021-02-17
      • 2019-06-18
      相关资源
      最近更新 更多