首页 > 解决方案 > Docker-compose 应该只运行一次服务

问题描述

我有一个在 postgresql 上创建表并插入几行的脚本。这个脚本是一个npm run执行的脚本sequelize.init()和几个 js 行。我需要这个脚本只在我第一次启动我的应用程序时运行。

这是我现在的docker-compose.yml

# docker-compose.yml

version: "3.7"
services:
  postgres:
    image: postgres
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
    ports: 
      - "5432:5432"
    volumes:
      - app-db:/var/lib/postgresql/data

  app-be:
    build:
      context: ./backend
    env_file:
     - ./backend/.env
    depends_on:
      - postgres
    ports:
      - "8080:8080"

  app-be-init:
    build:
      context: ./backend
      dockerfile: Dockerfile-Init
    env_file:
     - ./backend/.env
    depends_on:
      - postgres

  app-fe:
    build:
      context: ./frontend
    env_file:
     - ./frontend/.env
    depends_on:
      - postgres
    ports:
      - "3000:3000"
        
volumes:
  app-db:

有没有办法在 上配置它docker-compose,或者app-be-init如果它已经创建了表,应该足够了解不触发?

标签: postgresqlnpmdocker-compose

解决方案


一个非常简单的方法/解决方法(从引入它的 postrgesql 9.1 开始)是在您的语句中添加一个IF NOT EXISTS子句,CREATE TABLE您随后的“插入”可以通过WHERE NOT EXISTS.

可以在官方文档中找到更多信息。

例子:

CREATE TABLE foo IF NOT EXIST;
INSERT INTO foo (ID, COL1, COL2)
    SELECT 1, 'barfoo', 'foobar', 
    WHERE NOT EXISTS (SELECT 1 FROM foo WHERE id='1')

由于您在评论中提到,您宁愿通过编程方式解决此问题,而不是使用解决方法,如果脚本成功执行(可能想要检查退出代码..),您可以设置一个“标志”。

它可以是应用程序根目录中的一个简单 .json 文件,其属性{'executed':true/false}由脚本本身在执行结束时写入。

在脚本的开头,您可以检查该文件的值并分叉执行内容的逻辑。


推荐阅读