【问题标题】:How to create a table on start up using docker-compose, typeORM and MySql?如何使用 docker-compose、typeORM 和 MySql 在启动时创建表?
【发布时间】:2022-01-03 10:17:37
【问题描述】:

对于一项任务,我正在尝试使用 docker compose 在容器中开发一个简单的 API。就像现在一样,一切正常,除了 typeORM 不会从实体自动生成表。

这是我的docker-compose.yml

version: "3.8"
services:
  DOPS-mysql:
    image: mysql/mysql-server
    environment:
      name: DOPS-mysql
      MYSQL_DATABASE: 'DOPSDB'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
    volumes:
      - ./mysqldata:/var/lib/mysql
    ports:
      - '3360:3360'
  web:
    build: ./server
    depends_on:
      - DOPS-mysql
    ports:
      - '4000:4000'

Dockerfile 它基于 Web 服务构建

FROM node

WORKDIR /server

COPY package.json ./

RUN npm install

COPY . .

RUN  yarn build

EXPOSE 4000

CMD yarn docker

这是我的CreateConnection 函数

createConnection({
        type: "mysql",
        host: "DOPS-mysql",
        port: 3360,
        database: "DOPSDB",
        username: "user",
        password: "password",
        logging:false,
        synchronize:true,
        entities:[Food]
    })

还有我的实体:

import { Field, Int, ObjectType } from "type-graphql";
import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm";

@ObjectType()
@Entity()
export class Food extends BaseEntity {
    @Field(() => Int)
    @PrimaryGeneratedColumn()
    id!:number;

    @Field()
    @Column()
    name:string;

    @Field()
    @Column()
    taste:string;

    @Field()
    @Column()
    type:string;

    @Field()
    @Column({nullable:true})
    objectivity?:boolean;

    @Field()
    @CreateDateColumn()
    createdAt: Date;

    @Field()
    @UpdateDateColumn()
    updatedAt: Date;
} 

据我了解,一旦创建了数据库并建立了连接,typeORM 应该会根据实体自动生成表,但在这种情况下不会。我错过了什么?

提前感谢您的帮助。

编辑: 这是当我尝试访问 Foods 表时 appolographql 沙箱中显示的错误消息:

message": "No repository for \"Food\" was found. Looks like this entity is not registered in current \"default\" connection?"

【问题讨论】:

    标签: mysql typescript docker docker-compose typeorm


    【解决方案1】:

    您的 MySQL 服务器端口映射 (host_port:container_port) 不正确。在容器端应该是3306host_port (3360) 可以选择。

    depends_on 并没有像你想象的那样控制依赖。它是容器运行顺序。您需要在这两个容器之间创建一个网络来建立通信。

    version: "3.8"
    services:
      DOPS-mysql:    
        ...
        ...
        ports:
          - '3360:3306'
        networks:
          - mynetwork
      web:
        ...
        ...
        networks:
          - mynetwork
        environment:
          - MYSQL_HOST=DOPS-mysql
    
    networks:
        mynetwork:  
    

    并访问 web 容器代码中的 env 变量 (MYSQL_HOST),如下所示。

    createConnection({
            type: "mysql",
            host: process.env.MYSQL_HOST || "localhost",
            port: 3360,
            database: "DOPSDB",
            username: "user",
            password: "password",
            logging:false,
            synchronize:true,
            entities:[ "./entities/*.ts" ]
        })
    
    @Entity('Food')
    export class Food extends BaseEntity {
    

    【讨论】:

    • @Morgade,看看这个!!
    • 在修改容器端端口之前和之后,一切似乎都以相同的方式工作。
    • @Morgade,更新了答案
    • 当我尝试这样做时,在运行 docker-compose up 时出现以下错误:ERROR: The Compose file './docker-compose.yml' is invalid because: Unsupported config option for services.networks: 'mynetwork'
    • 我已经去掉了引号,你现在可以查看
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多