Docker图像参考格式



我正在尝试编写一个docker-compose.yml,然后在连续集成管道中使用,但也应该可以在本地使用。

我天真地尝试过:

services:
app:
build:
...
image: ${IMAGE_SERVER_URL:-}/image_name:${IMAGE_TAG:-latest}

在我的gitlab-ci.yml中,我登录到图像服务器:

echo ${IMAGE_SERVER_PASSWORD} | docker login -u ${IMAGE_SERVER_USERNAME} --password-stdin ${IMAGE_SERVER_URL}

然后我可以做

docker-compose build --pull
docker-compose push

那么问题出在哪里呢

当vscode中的.devcontainer试图构建应用程序时,我得到了ERROR: Invalid Reference Format,这当然是由于

/image-name:latest

不是有效的图像名称。所以问题是斜杠。

docker-compose目前不接受${IMAGE_SERVER_URL+/}(参见docker文档(,所以这是不可能的。我当然可以在环境变量中加入斜杠,但我觉得这会在其他地方引发类似的问题。

在格式化动态图像名称时,有什么最佳实践吗?

您可以将服务器url默认为Docker Hub的通用名称docker.io。如果您使用的是库中的官方图像,您还可以将library作为存储库名称:

${IMAGE_SERVER_URL:-docker.io}/image_name:${IMAGE_TAG:-latest}

有两种解决方案可以满足OP的要求。

一种是将docker-compose.ymlIMAGE_SERVER_URL的默认值设置为非空字符串(就像OP对IMAGE_TAG所做的那样(。

另一种是在放置在docker-compose.yml旁边的.env文件中设置所述默认值。

只要开发人员不打算将其本地构建的映像推送到回购中,那么只要它不是空的,默认值是多少就无关紧要了。

根据文档,在这两种情况下,CI服务器在外壳中设置的变量都应该覆盖默认值。

编辑:另一个在我看来不太优雅的解决方案是在docker-compose.yml中使用${IMAGE_SERVER_URL:?Variable IMAGE_SERVER_URL must be set to a non-empty string}来生成更易于理解的错误消息。

最新更新