如何在docker中启动应用程序之前运行sql脚本

时间:2017-02-16 03:22:55

标签: entity-framework postgresql docker asp.net-core

我在Windows 10中部署了Asp.net Core,PostgreSql和Docker的项目(没有安装PostgreSql)。所以我必须在应用程序启动之前运行sql脚本来更新数据(用于注册单例依赖注入)。

我的Dockerfile内容如下:

# TODO use official docker image
FROM microsoft/dotnet:1.1.0-sdk-projectjson

# Install .NET CLI dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
        autoconf \
        automake \
        bzip2 \
        file \
        g++ \
        gcc \
        imagemagick \
        libbz2-dev \
        libc6-dev \
        libcurl4-openssl-dev \
        libdb-dev \
        libevent-dev \
        libffi-dev \
        libgdbm-dev \
        libgeoip-dev \
        libglib2.0-dev \
        libjpeg-dev \
        libkrb5-dev \
        liblzma-dev \
        libmagickcore-dev \
        libmagickwand-dev \
        libmysqlclient-dev \
        libncurses-dev \
        libpng-dev \
        libpq-dev \
        libreadline-dev \
        libsqlite3-dev \
        libssl-dev \
        libtool \
        libwebp-dev \
        libxml2-dev \
        libxslt-dev \
        libyaml-dev \
        make \
        patch \
        xz-utils \
        zlib1g-dev \
    && rm -rf /var/lib/apt/lists/*

# Set environment variables
ENV ASPNETCORE_URLS="http://*:5000"
ENV ASPNETCORE_ENVIRONMENT="Development"

# Copy files to app directory
COPY . /app

# Set working directory
WORKDIR /app

# Restore NuGet packages
RUN ["dotnet", "restore"]

# Build app
RUN ["dotnet", "build"]

#dotnet ef migrations add InitialCreate
RUN ["dotnet", "ef", "migrations", "add", "InitialCreate"]
# Open up port
EXPOSE 5000

CMD chmod +x ./docker-start.sh
CMD bash ./docker-start.sh

以下是docker-start.sh的内容:

#!/bin/bash

set -e

# How to apply migrations
dotnet ef database update

# I would like to run sql file at here"
psql -h postgres --username postgres -d POSTGRES_USER -a -f /app/static.sql    

# Start web app
echo "Starting web app"
dotnet run

我该怎么做?谢谢高级。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方法。我错过了 postgresql-client 。我们需要安装 postgresql-client ,使用 psql 从Dockerfile运行sql脚本。

所以应该更改Dockerfile:

# TODO use official docker image
FROM microsoft/dotnet:1.1.0-sdk-projectjson

# Install .NET CLI dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
        autoconf \
        automake \
        bzip2 \
        file \
        g++ \
        gcc \
        imagemagick \
        libbz2-dev \
        libc6-dev \
        libcurl4-openssl-dev \
        libdb-dev \
        libevent-dev \
        libffi-dev \
        libgdbm-dev \
        libgeoip-dev \
        libglib2.0-dev \
        libjpeg-dev \
        libkrb5-dev \
        liblzma-dev \
        libmagickcore-dev \
        libmagickwand-dev \
        libmysqlclient-dev \
        libncurses-dev \
        libpng-dev \
        libpq-dev \
        libreadline-dev \
        libsqlite3-dev \
        libssl-dev \
        libtool \
        libwebp-dev \
        libxml2-dev \
        libxslt-dev \
        libyaml-dev \
        make \
        patch \
        xz-utils \
        zlib1g-dev \
        postgresql-client \
    && rm -rf /var/lib/apt/lists/*

# Install netcat so that we can ping the database server until it
RUN apt-get update -qq \
    && apt-get install -y netcat \
    && rm -rf /var/lib/apt/lists/*

# Set environment variables
ENV ASPNETCORE_URLS="http://*:5000"
ENV ASPNETCORE_ENVIRONMENT="Development"
ENV DB_HOSTNAME="posgres"

# Copy files to app directory
COPY . /app

# Set working directory
WORKDIR /app

# Restore NuGet packages
RUN ["dotnet", "restore"]

# Build app
RUN ["dotnet", "build"]

#dotnet ef migrations add InitialCreate
RUN ["dotnet", "ef", "migrations", "add", "InitialCreate"]
# Open up port
EXPOSE 5000

CMD chmod +x ./docker-start.sh
CMD bash ./docker-start.sh

感谢。