我正在设置一个简单的后端,该后端对postgres数据库执行CRUD操作,并希望在docker-compose up运行时自动创建数据库并进行迁移。
我已经尝试将以下代码添加到 Dockerfile 或 entrypoint.sh 中,但是它们都不起作用。
<div class="splash">
<picture>
<img src="//unsplash.it/1600x900" />
</picture>
<div class="modal">
<p>Form goes here/</p>
</div>
</div>
如果docker完全启动后单独运行,则此代码将起作用
我已经尝试将createdb --host=localhost -p 5432 --username=postgres --no-password pg_development
createdb db:migrate
添加到卷中,但这也不起作用
这是 Dockerfile
- ./db-init:/docker-entrypoint-initdb.d
这是我的 docker-compose.yml
FROM node:10.12.0
# Create app directory
RUN mkdir -p /restify-pg
WORKDIR /restify-pg
EXPOSE 1337
ENTRYPOINT [ "./entrypoint.sh" ]
entrypoint.sh (在这里我得到version: '3'
services:
db:
image: "postgres:11.2"
ports:
- "5432:5432"
volumes:
- ./pgData:/var/lib/psotgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD:
POSTGRES_DB: pg_development
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- .:/restify-pg
environment:
DB_HOST: db
)
createdb: command not found
我希望当我运行docker时,将会进行迁移和数据库创建。
答案 0 :(得分:0)
entrypoint.sh(在这里我可以创建b:找不到命令)
在nodejs容器中运行createdb
将不起作用,因为它是postgres特定的命令,并且默认情况下未安装在nodejs映像中。
如果在postgres容器上指定POSTGRES_DB: pg_development
env var,则数据库将为created automatically when the container starts。因此,无论如何都无需在安装在nodejs容器中的createdb
中运行entrypoint.sh
。
要使sequelize db:migrate
工作,您需要:
sequelize-cli
添加到package.json
中的依赖项中npm install
以便安装npx sequelize db:migrate
这是一个提案:
# docker-compose.yml
version: '3'
services:
db:
image: "postgres:11.2"
ports:
- "5432:5432"
volumes:
- ./pgData:/var/lib/psotgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD:
POSTGRES_DB: pg_development
app:
working_dir: /restify-pg
entrypoint: ["/bin/bash", "./entrypoint.sh"]
image: node:10.12.0
ports:
- "3000:3000"
volumes:
- .:/restify-pg
environment:
DB_HOST: db
# package.json
{
...
"dependencies": {
...
"pg": "^7.9.0",
"pg-hstore": "^2.3.2",
"sequelize": "^5.2.9",
"sequelize-cli": "^5.4.0"
}
}
# entrypoint.sh
npm install
npx sequelize db:migrate
npm run dev
答案 1 :(得分:0)
我认为您需要先将entrypoint.sh
添加到容器中。因此添加:
ADD entrypoint.sh /restify-pg/entrypoint.sh
在“公开”命令之前。然后将暴露命令更改为:
ENTRYPOINT [ "/restify-pg/entrypoint.sh" ]
答案 2 :(得分:0)
如果您可以从nodejs而非docker运行迁移,请考虑使用this solution