Docker映像参考格式

时间:2020-08-13 10:05:33

标签: docker docker-compose

我正在尝试编写一个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 docs),因此这是不可能的。我当然可以在环境变量中包含斜杠,但是我感觉这将在其他地方引起类似的问题。

格式化动态图像名称时是否有最佳实践?

2 个答案:

答案 0 :(得分:1)

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

一种方法是将IMAGE_SERVER_URL中的docker-compose.yml的默认值设置为非空字符串(例如OP对IMAGE_TAG所做的操作)。

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

只要开发人员不打算将其本地生成的映像推送到存储库,则默认值是多少也可以,只要它不为空即可。

在两种情况下,根据documentation,CI服务器在外壳程序中设置的变量应覆盖默认值。

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

答案 1 :(得分:1)

您可以将服务器URL默认为Docker Hub的公用名docker.io。而且,如果您使用的是库中的正式映像,则还可以包括library作为存储库名称:

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