我正在尝试编写一个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.yml
中IMAGE_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}
来生成更易于理解的错误消息。