使用docker-compose创建数据库

时间:2019-10-13 12:52:49

标签: postgresql docker docker-compose

我有以下docker-compose.yml

version: '3.4'

services:
  # bla bla bla

  pg:
    image: postgres:9.6    
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD:
      POSTGRES_DB: just_db
volumes:
  pgdata:

然后是Dockerfile:

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY . .
RUN dotnet publish ./src/WebApp/WebApp.csproj -c Release -o /app

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS final
WORKDIR /app
EXPOSE 80
COPY --from=build /app .

ENTRYPOINT ["dotnet"]
CMD ["WebApp.dll"]

如我所读,如果我在POSTGRES_USER db中设置POSTGRES_PASSWORDPOSTGRES_DBdocker-compose.yml变量,将被创建。来自文件夹docker-entrypoint-initdb.d的sql脚本将被执行。我希望在运行just_db之后创建数据库docker-compose up --build,但是不会发生。如何使用docker-comose创建数据库?

1 个答案:

答案 0 :(得分:0)

docker-compose仅在$PGDATA不存在的情况下创建数据库。这是因为仅在initdb为空时(或更确切地说,在不存在$PGDATA文件的情况下才调用PG_VERSION)。请参阅entrypoint source for more info。由于您在pgdata:/var/lib/postgresql/data中提供了docker-compose.yml,因此Docker将只使用现有的内容,而不会创建名为just_db的其他数据库。如果要创建just_db,则需要提供一个$PGDATA空的卷(或删除PG_VERSION,但可能会使情况更混乱),或者省略总数。