Docker Compose:检测是否需要重建图像

时间:2015-10-21 06:26:20

标签: docker docker-compose

我正在尝试创建一个Docker设置(使用docker-compose)来在开发过程中测试我的一个Python应用程序。 docker-compose.yml启动Postgres服务器,Redis服务器和PhantomJS服务器,然后使用pytest运行测试。

这就是我test.sh的样子:

#!/bin/bash
UP=$(docker-compose up -d redis postgres phantomjs 2>&1)
echo $UP
if [[ $UP == *"Starting radar_postgres"* ]]; then
    echo "Sleeping 10 seconds to wait for PostgreSQL server..."
    sleep 10
fi
docker-compose build tests && \
docker-compose run \
    --rm \
    -e GOOGLE_OAUTH2_CLIENT_ID='$GOOGLE_OAUTH2_CLIENT_ID' \
    -e GOOGLE_OAUTH2_CLIENT_SECRET='$GOOGLE_OAUTH2_CLIENT_SECRET' \
    -e GOOGLE_DEVELOPER_TOKEN='$GOOGLE_DEVELOPER_TOKEN' \
    tests $@

首先启动依赖项。由于docker-compose up的工作方式,它们会在必要时自动重建。

然后我在tests容器中运行一次性工作。我使用一次性工作而不是使用docker-compose up,因为这样我可以将参数传递给测试框架。

问题是容器总是被重建,即使Dockerfile没有改变也不需要重建。 (当然每个步骤都使用缓存,但它仍然需要4-5秒。)相反,如果我放弃docker-compose build行,那么当我更改Dockerfile时,容器不会被重建。

有没有办法只在必要时重建图像?

1 个答案:

答案 0 :(得分:1)

请注意,有一个讨论(issue 1455)要从docker-compose中删除构建。

  

Compose的主要工作是编排而不是构建,并且Docker镜像是绘制该行的自然场所

所以最好使用docker build命令(应该只在必要时构建图像),而不是使用docker-compose build(这可能会过于激进)