【问题标题】:docker pull in unit files only works at first start, gets ignored later ondocker pull in unit files 仅在第一次启动时有效,稍后会被忽略
【发布时间】:2015-02-24 01:13:37
【问题描述】:

我有一个单元,运行 docker 映像的“最新”标签。最新的镜像是在第一次启动时通过“docker pull”命令从单元文件中获取的。

但是在任何后续(重新)启动时,“docker pull”命令似乎都没有被执行,因为任何带有“latest”标签的新图像修订都没有被拉取。

在命令行上运行“docker pull ...”按预期工作。

我的服务文件:

[Unit]
Description=Foo
Requires=docker.service
After=docker.service

[Service]
TimeoutStartSec=0
KillMode=none
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill foo
ExecStartPre=-/usr/bin/docker rm foo
ExecStartPre=/usr/bin/docker login -e foo@example.com -u bla -p xxxxx https://myregistry.example.com && /usr/bin/docker pull myregistry.example.com/foo
ExecStart=/usr/bin/docker run --name foo myregistry.example.com/foo
ExecStop=/usr/bin/docker stop foo

[X-Fleet]
Global=true

这种行为是有意的吗?是否可以解决此问题?

提前致谢!

编辑:运行CoreOS 557.2.0、docker 1.4.1 和fleltd 0.9.0

【问题讨论】:

  • 您的docker pull 命令通过&&docker login 命令的成功相关联。如果您已经登录,docker login 是否会返回错误?
  • 不,说“登录成功”。但没有错误代码。
  • systemctl 说 (code=exited, status=0/SUCCESS) 关于命令
  • 在 (a) 本单元的日志 (journal -u ...) 或 docker 守护程序日志中是否有任何错误(或诊断)?
  • 嗯,你看起来可能是对的。删除“docker login ... ||”时每次重新启动时,一切都会按预期进行。假设 .dockercfg 已经存在并带有凭据......

标签: coreos


【解决方案1】:

选项 1 - 使用多个 ExecStartPre

我不确定您是否可以在 ExecStartPre 部分中使用 shell 样式的 &&

所以一种简单的方法就是将其分解

ExecStartPre=/usr/bin/docker login -e foo@example.com -u bla -p xxxxx https://myregistry.example.com 
ExecStartPre=/usr/bin/docker pull myregistry.example.com/foo

选项 2 - 通过 cloud-config 安装 .dockercfg 凭据

如果您不想在单元文件中嵌入凭据,您可以让您的 CoreOS 云配置使用这样的部分写入凭据

write_files:
  - path: /home/core/.dockercfg
    owner: core:core
    permissions: 0644
    content: |
      {"https://myregistry.example.com:5000":{"auth":"Y2FudGJlbGlldmU6eW91ZGVjb2RlZHRoaXM=","email":"user@example.com"}}

auth 值是一个 base64 的用户名:密码组合,您可以创建或直接获取一个有效的 .dockercfg 文件。

所以,现在您的 CoreOS 机器将使用他们需要的凭据启动,您还需要做一件事 - 确保需要登录到您的注册表的单元以核心用户身份运行:

[Service]
User=core
ExecStartPre=/usr/bin/docker pull myregistry.example.com/foo

选项 3 - 使用实际的外壳

如果你想做类似 shell 的事情,你总是可以只启动一个 shell 并让它执行你需要的东西

ExecStartPre=/bin/sh -c '/usr/bin/docker login -e foo@example.com -u bla -p xxxxx https://myregistry.example.com && /usr/bin/docker pull myregistry.example.com/foo'

【讨论】:

  • 谢谢!正如您在 IRC 上提到的,如果需要链接,也可以这样放置 ExecStartPre:ExecStartPre=/bin/sh -c '/usr/bin/docker login -e foo@example.com -u bla -p xxxxx https://myregistry.example.com && /usr/bin/docker pull myregistry.example.com/foo'
  • 是的,为了完整起见,我会将其添加到答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多