我有一个单位,运行"最新"码头图像的标记。最新图像由" 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
答案 0 :(得分:2)
我不确定您是否可以在&&
部分中使用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
如果您不想在单元文件中嵌入凭据,可以让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
如果你想做类似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'