我正在尝试编写一个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),因此这是不可能的。我当然可以在环境变量中包含斜杠,但是我感觉这将在其他地方引起类似的问题。
格式化动态图像名称时是否有最佳实践?
答案 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}