我正在尝试使用 sh 脚本创建一个具有预加载初始架构的 docker 容器。这意味着我有一个 python main.py 文件,它使用以下代码运行 bash 脚本:
rm -rf postgres_data
docker-compose down --rmi all --volumes
docker-compose up --force-recreate
还有一个包含以下代码的 docker-compose.yml:
version: '3'
services:
postgres:
image: postgres:13.1
container_name: mydatabasename_database
healthcheck:
test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
timeout: 45s
interval: 10s
retries: 10
restart: always
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=password
- POSTGRES_DB=MYDATABASENAME_DB
- APP_DB_USER=appuser
- APP_DB_PASS=appass
- APP_DB_NAME=appname
volumes:
- ./init-schema.sql:/docker-entrypoint-initdb.d/init-db-01.sql
- postgres_data:/var/lib/postgresql/data
ports:
- 5432:5432
volumes:
postgres_data:
我还有一个名为 init-schema.sql 的 sql 脚本,其代码如下:
CREATE USER appuser WITH PASSWORD 'appass';
CREATE DATABASE mydatabasename_db;
GRANT ALL PRIVILEGES ON DATABASE mydatabasename_db TO appuser;
\c mydatabasename_db;
CREATE TABLE IF NOT EXISTS my_table (
client_id character varying(36) NOT NULL,
value character varying(255)
);
再次,在 docker 日志中,一切似乎都在按预期运行;但是,当我尝试通过 dbeaver 或 pycharm 连接到容器时,该表不存在。顺便说一句,所有这些文件都位于同一目录中。
我真的已经尝试了我一生中的一切。最初,我尝试简单地使用
docker build
命令和Dockerfile通过COPY ./initial-schema.sql /docker-entrypoint-initdb.d/config.sql
将initial-schema.sql复制到容器目录中,但这也由于某种原因不起作用。因此,我转而使用 docker-compose 插件,然后编写了上面提供的代码。我不知道还能做什么。我还手动运行了 sql 脚本,它运行得很好。 dbeaver 和 pycharm 中都会弹出该表格。我希望所有内容都可以一步加载,而这个错误就是我完成此任务所剩下的。我想提前向大家表示感谢!希望你们能发现我遗漏的东西,因为我完全没有想法。
我自己修好了!似乎将该部分命名为
postgres
导致了问题。将我的文件更改为:
version: '3'
services:
mydatabasename:
image: postgres:13.1
healthcheck:
test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
timeout: 45s
interval: 10s
retries: 10
restart: always
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=password
volumes:
- ./init-schema.sql:/docker-entrypoint-initdb.d/init-db-01.sql
- ./postgres-data:/var/lib/postgresql/data
ports:
- 5432:5432
volumes:
postgres-data: