Docker Compose:检测镜像是否需要重新构建

Dan*_*gen 6 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 $@
Run Code Online (Sandbox Code Playgroud)

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

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

问题是容器总是在重建,即使 Dockerfile 没有改变并且不需要重建。(当然,每个步骤都使用缓存,但仍然需要 4-5 秒。)相比之下,如果我保留该行docker-compose build,那么当我更改 Dockerfile 时,容器不会被重建。

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

Von*_*onC 3

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

Compose 的主要工作是编排而不是构建,而 Docker 镜像是划定这条线的自然位置

因此最好使用docker build命令(只应在必要时构建图像),而不是使用docker-compose build(这可能构建得有点过于激进)