Docker图像参考格式
我正在尝试编写一个Docker图像参考格式,docker,docker-compose,Docker,Docker Compose,我正在尝试编写一个docker compose.yml,然后在持续集成管道中使用,但也可以在本地使用 我天真地试过: 在mygitlab ci.yml中,我登录到映像服务器: echo ${IMAGE_SERVER_PASSWORD} | docker login -u ${IMAGE_SERVER_USERNAME} --password-stdin ${IMAGE_SERVER_URL} 然后我就可以做了 docker-compose build --pull docker-compose
docker compose.yml
,然后在持续集成管道中使用,但也可以在本地使用
我天真地试过:
在mygitlab 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
尝试构建应用程序时,我得到错误:无效的引用格式
,这当然是由于
/image-name:latest
不是有效的图像名称。所以问题是斜杠
docker compose
当前不接受(cf.),因此这是不可能的。我当然可以在环境变量中包含斜杠,但我觉得这会在其他地方引起类似的问题
在格式化动态图像名称时,有没有最佳做法?有两种解决方案可以满足OP的要求 一种是将
docker compose.yml
中的IMAGE\u SERVER\u URL
的默认值设置为非空字符串(就像OP对IMAGE\u标记所做的那样)
另一个是在docker compose.yml
旁边的文件中设置所述默认值
只要开发者不打算将其本地构建的映像推送到回购协议,那么默认值是什么就不重要了,只要它不是空的
根据,在这两种情况下,CI服务器在shell中设置的变量应覆盖默认值
编辑:
另一种解决方案,在我看来不那么优雅,就是在docker compose.yml
中使用${IMAGE\u SERVER\u URL:?Variable IMAGE\u SERVER\u URL必须设置为非空字符串}
,以生成更易于理解的错误消息。有两种解决方案可以满足OP的要求
一种是将docker compose.yml
中的IMAGE\u SERVER\u URL
的默认值设置为非空字符串(就像OP对IMAGE\u标记所做的那样)
另一个是在docker compose.yml
旁边的文件中设置所述默认值
只要开发者不打算将其本地构建的映像推送到回购协议,那么默认值是什么就不重要了,只要它不是空的
根据,在这两种情况下,CI服务器在shell中设置的变量应覆盖默认值
编辑:
另一个在我看来不那么优雅的解决方案是在docker compose.yml
中使用${IMAGE\u SERVER\u URL:?Variable IMAGE\u SERVER\u URL必须设置为非空字符串}
,以生成更易于理解的错误消息。您可以将服务器URL默认为docker Hub的公共名称docker.io
。如果您使用的是库中的官方图像,还可以将library
作为存储库名称:
${IMAGE_SERVER_URL:-docker.io}/image_name:${IMAGE_TAG:-latest}
您可以将服务器url默认为Docker Hub的通用名称Docker.io
。如果您使用的是库中的官方图像,还可以将library
作为存储库名称:
${IMAGE_SERVER_URL:-docker.io}/image_name:${IMAGE_TAG:-latest}
有什么原因不能在本地设置变量IMAGE\u SERVER\u URL吗?@KonradBotor您的意思是只在本地附加斜杠?当然,这会起作用——只是让一切变得更加脆弱——我想这是一个解决方案,但我考虑的是export IMAGE\u SERVER\u URL=something;代码。
@KonradBotor花了我一段时间才意识到,你实际上是指vscode中的code
,而不是更多代码的占位符。是的,我想您可以将环境变量设置为localy。但是错误消息不是很具有描述性,如果其他开发人员退出项目,他们也会遇到这个问题。我试图在这里建立一个模板:-pIs,你为什么不能在本地设置变量IMAGE\u SERVER\u URL?@KonradBotor你的意思是只在本地附加斜杠?当然,这会起作用——只是让一切变得更加脆弱——我想这是一个解决方案,但我考虑的是export IMAGE\u SERVER\u URL=something;代码。
@KonradBotor花了我一段时间才意识到,你实际上是指vscode中的code
,而不是更多代码的占位符。是的,我想您可以将环境变量设置为localy。但是错误消息不是很具有描述性,如果其他开发人员退出项目,他们也会遇到这个问题。我想在这里建立一个模板:-pdo你知道图像文件结构深度的限制吗?也就是说,是否允许我任意使用folder1/folder2/…/foldern/image\u name:tag
?因为如果我有一个更深层的命名结构,这可能会对以后产生影响,如果URL的处理方式与文件夹不同,那么可能会破坏默认的IMAGE\u SERVER\u URL
。我找不到任何关于有效引用格式的信息,这很烦人,因为错误无效引用格式
显然存在。关于Docker官方注册表实现所述引用格式的方式:。如果我理解正确,您最多可以有server\u url/path/path/name:tag
,但我想可能还有其他注册表实现支持更长的路径。你可能想问一个单独的问题。那么,如果我将图像声明为绝对不是\u a\u服务器\u url/folder1/folder2/name:tag
,会发生什么?如果它只是阻止您推送图像,那么在某些情况下,这甚至可以防止意外发布私有图像,因为据我所知,推送将失败,但否则它应该可以正常工作。@FelixB。一些注册中心支持更深的嵌套,但通常只看到两层,一个组织或用户,然后是一个特定的映像。API本身并不限制您变得更加复杂,但各种实现可能会阻止您在命名约定之外定义存储库。您知道图像的文件结构深度限制吗?即