我有以下docker-compose文件
version: '3.2'
services:
nd-db:
image: postgres:9.6
ports:
- 5432:5432
volumes:
- type: volume
source: nd-data
target: /var/lib/postgresql/data
- type: volume
source: nd-sql
target: /sql
environment:
- POSTGRES_USER="admin"
nd-app:
image: node-docker
ports:
- 3000:3000
volumes:
- type: volume
source: ndapp-src
target: /src/app
- type: volume
source: ndapp-public
target: /src/public
links:
- nd-db
volumes:
nd-data:
nd-sql:
ndapp-src:
ndapp-public:
nd-app包含一个migrations.sql和seed.sql文件。我想在容器启动后运行它们。
如果我手动运行命令,它们将像这样
docker exec nd-db psql admin admin -f /sql/migrations.sql
docker exec nd-db psql admin admin -f /sql/seeds.sql
答案 0 :(得分:0)
docker-composer -f path/to/config.yml name_of_container nd-db psql admin admin -f /sql/migrations.sql
工作吗?
我发现从笔记本电脑运行命令时必须指定配置和容器。
答案 1 :(得分:0)
使用此docker-compose文件运行up
时,它将在启动nd-db和nd-app容器时运行container entrypoint命令。对于nd-db,这会做一些准备工作,然后启动postgres数据库。
entrypoint命令在Dockerfile中定义,并且期望将ENTRYPOINT
和CMD
的配置位进行组合。您可能要做的是在自定义Dockerfile中覆盖ENTRYPOINT,或者在docker-compose.yml中overriding覆盖它。
看postgres:9.6 Dockerfile,它有以下两行:
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
您可以在docker-compose.yml中的nd-db配置中添加以下内容,以保留现有入口点,还可以“菊花链式”自定义migration-script.sh
步骤。
entrypoint: ["docker-entrypoint.sh", "migration-script.sh"]
自定义脚本仅需要一种特殊的行为:它需要对以下任何参数进行直通执行,因此容器将继续启动postgres:
#!/usr/bin/env bash
set -exo pipefail
psql admin admin -f /sql/migrations.sql
psql admin admin -f /sql/seeds.sql
exec "$@"