我正在尝试创建一个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时,容器不会被重建。
有没有办法只在必要时重建图像?
答案 0 :(得分:1)
请注意,有一个讨论(issue 1455)要从docker-compose中删除构建。
Compose的主要工作是编排而不是构建,并且Docker镜像是绘制该行的自然场所
所以最好使用docker build
命令(应该只在必要时构建图像),而不是使用docker-compose build
(这可能会过于激进)