<p>为这个任务使用第三个容器怎么样?据我所知,它只需要执行一次,所以将它添加到入口点可能不是最好的做法,除非您有一些检查来避免每次容器启动时都运行它,即使它不会造成伤害,这是一个不必要的过程。在</p>
<p>使用第三个容器将执行以下操作:</p>
<p>当您运行<code>docker-compose up</code>时,它将根据您想要的顺序启动,然后运行命令,然后退出。关于路径,您可以在实际应用程序容器和迁移任务容器之间创建一个共享命名卷。例如:</p>
<blockquote>
<p>I have added a <code>base</code> service to avoid duplication in the docker-compose</p>
</blockquote>
<pre><code>version: "3"
services:
base:
build: .
volumes:
- .:/code
env_file:
- .env
command: 'false'
web:
extends:
service: base
command: flask run host=0.0.0.0
links:
- "db"
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres:10
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=app
ports:
- "5432:5432"
expose:
- 5432
migrations:
extends:
service: base
command: python manage.py db upgrade
depends_on:
- db
</code></pre>
<p>其他注意事项:</p>
<ul>
<li><code>links</code>不需要,因为docker compose默认创建一个网络。在</li>
<li><code>expose</code>也不需要,只要它们在同一网络中,容器就会看到彼此的端口。在</li>
<li>您可能会面临某种竞争条件,在这种情况下,您的数据库实际上还没有准备好进行连接,而您的django应用程序试图连接到它。因此,为了解决这个问题,您需要使用<code>wait-for-it</code>或{<cd5>},如{a1}所述</li>
</ul>