我有一个项目,结构如下:
proj
src
application
app.py
manage.py
migrations
Dockerfile
docker-compose.yaml
我的目标是在docker compose期间从应用程序目录运行迁移来在数据库中创建表。在
^{pr2}$Dockerfile文件
FROM python:3.7-alpine
ADD requirements.txt /code/
WORKDIR /code
RUN apk add --no-cache postgresql-dev gcc python3 musl-dev && \
pip3 install -r requirements.txt
ADD . /code
EXPOSE 5000
WORKDIR /code/src/application
CMD ["flask", "run", "--host=0.0.0.0"]
码头工人-合成.yaml在
---
version: "3"
services:
web:
links:
- "db"
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- db
env_file:
- .env
db:
image: postgres:10
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=app
ports:
- "5432:5432"
expose:
- 5432
我怎么能做到呢?在
我将添加一个bash脚本,其中包含启动期间要运行的命令,并将其用作映像中的默认入口点。通常最好将此脚本称为
entrypoint.sh
然后,在Dockerfile中,将最后一行替换为以下内容
^{pr2}$如果您只想在Docker compose中运行升级命令,那么您可以像这样在compose文件中重写它,而不是更改图像中的默认入口点
^{3}$为这个任务使用第三个容器怎么样?据我所知,它只需要执行一次,所以将它添加到入口点可能不是最好的做法,除非您有一些检查来避免每次容器启动时都运行它,即使它不会造成伤害,这是一个不必要的过程。在
使用第三个容器将执行以下操作:
当您运行
docker-compose up
时,它将根据您想要的顺序启动,然后运行命令,然后退出。关于路径,您可以在实际应用程序容器和迁移任务容器之间创建一个共享命名卷。例如:其他注意事项:
links
不需要,因为docker compose默认创建一个网络。在expose
也不需要,只要它们在同一网络中,容器就会看到彼此的端口。在wait-for-it
或{我们试试docker-合成.yml在
相关问题 更多 >
编程相关推荐