docker pull in unit files仅在第一次启动时起作用,稍后会被忽略

时间:2015-02-23 14:04:49

标签: coreos

我有一个单位,运行"最新"码头图像的标记。最新图像由" docker pull"首次启动时来自单元文件的命令。

但是在任何后续(重新)开始时,"码头工具拉动"命令似乎没有被执行,因为任何新的图像修订标记为"最新"没有被拉。

运行" 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和fleetd 0.9.0

1 个答案:

答案 0 :(得分:2)

选项1 - 使用多个ExecStartPre

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

所以一个简单的方法就是分解它

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 cloud-config使用类似的部分写入凭据

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的事情,你可以随时启动一个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'