postgresql - 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
如果它已经创建了表,应该足够了解不触发?
解决方案
一个非常简单的方法/解决方法(从引入它的 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}
由脚本本身在执行结束时写入。
在脚本的开头,您可以检查该文件的值并分叉执行内容的逻辑。