【问题标题】:Prevent skip in docker-compose防止在 docker-compose 中跳过
【发布时间】:2016-07-15 22:49:27
【问题描述】:

我有一个 docker-compose.yml 用于带有后端的 Django Web 应用程序。它看起来像这样:

version: '2'

services:
  db:
    image: # special image
    ports:
      - "1433:1433"
    environment:
      PASSWORD: "*********"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    depends_on:
      - db

当我运行sudo docker-compose build 时,输出的第一行显示

db uses an image, skipping. 
Building web.

我需要在web 之前构建db 映像。

我怎样才能让db 图像首先被构建?

【问题讨论】:

  • 假设您的意思是数据库映像的“运行”,而不是“构建”?您认为这里的行为与正在发生的情况有何不同?
  • @JHarris 是的,“运行”而不是“构建”。 Web 构建需要 db 启动并运行才能完成。这就是为什么我需要先运行db
  • 一般同意blackrobot的回答。这似乎是糟糕的设计。你不能在运行时初始化数据库连接/依赖,而不是构建?使整个事情更加健壮。
  • depends_on 应该符合您的描述。您是否遇到不同的结果或错误? “特殊图像”是否按预期发挥作用?如果是这样,这应该可以工作——web 服务将基于docker-compose build 构建,db 映像将创建并运行db 服务,然后web 服务将从刚刚构建的@987654336 运行@ 图片。除了db 容器正在运行之外,它不会检查任何其他内容,因此如果您需要更具体地验证任何状态,则必须对其进行管理。 Compose 文档适用于这种情况。

标签: django docker docker-compose


【解决方案1】:

您可以在构建web 之前在Detached mode 中启动您的db 容器:

$ docker-compose up -d db
$ docker-compose build web

不过,这个seems like an anti-pattern。我建议您尽可能保持web 的构建过程通用,而是使用环境变量或command arguments 来完成此操作。

例如,如果您需要将相同的配置值传递给webdb,您可以使用an env_file 完成此操作:

# db_credentials.env
USER="django"
PASSWORD="********"
DATABASE="django_db"

在您的docker-compose.yml 文件中:

services:
  db:
    # ...
    env_file: db_credentials.env

  web:
    # ...
    env_file: db_credentials.env

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2018-05-16
    • 2023-02-18
    • 2013-04-30
    • 2017-11-27
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多