Docker撰写:检测是否需要重新构build图像

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

这是我的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工作方式,必要时会自动重build。

然后我在tests容器中运行一次性工作。 我使用一次性工作而不是使用docker-compose up因为这样我可以将parameter passing给testing框架。

问题是容器总是被重build,即使Dockerfile没有改变,也不需要重build。 (当然,每个步骤都使用caching,但仍需要4-5秒。)相比之下,如果我离开docker-compose build线,那么在更改Dockerfile时不会重build容器。

有没有办法只在必要时重build图片?

请注意,有一个讨论( 问题1455 )从docker-compose中删除构build。

撰写的主要工作是协调而不是构build,而Docker镜像是绘制该线的自然地方

所以最好使用docker build命令(应该只在必要的时候生成镜像),而不是使用docker-compose build (这可能会过于积极)