docker pull in unit files работает только при первом запуске, позже игнорируется

У меня есть модуль, на котором запущен «последний» тег образа докера. Последний образ извлекается командой «docker pull» из файла модуля при первом запуске.

Но при любых последующих (повторных) запусках команда «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 [email protected] -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


person mbo    schedule 23.02.2015    source источник
comment
Ваша команда docker pull связана с успехом команды docker login через &&. docker login возвращает ошибку, если вы уже вошли в систему?   -  person larsks    schedule 23.02.2015
comment
Нет, говорит, что вход в систему выполнен успешно. Но без кода ошибки.   -  person mbo    schedule 23.02.2015
comment
systemctl говорит (code=exited, status=0/SUCCESS) о команде   -  person mbo    schedule 23.02.2015
comment
Любые ошибки (или диагностика) в (а) журнале для этого устройства (журнал -u ...) или в журнале демона докера?   -  person larsks    schedule 23.02.2015
comment
Хм, похоже, ты прав. При удалении входа в докер... || все работает ожидаемо при каждом перезапуске. Предполагая, что .dockercfg уже существует с учетными данными....   -  person mbo    schedule 23.02.2015


Ответы (1)


Вариант 1 — использовать несколько ExecStartPre

Я не уверен, что вы можете использовать && в стиле оболочки в разделе ExecStartPre.

Итак, один простой подход - просто разбить его.

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

Вариант 2 — установить учетные данные .dockercfg через cloud-config

Если вы не хотите встраивать учетные данные в файлы модулей, вы можете настроить облачную конфигурацию CoreOS для записи учетных данных с помощью раздела, подобного этому.

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

Значение auth представляет собой комбинацию имени пользователя и пароля base64, которую вы можете создать или просто получить рабочий файл .dockercfg.

Итак, теперь ваши машины с CoreOS будут запускаться с необходимыми учетными данными, вам нужно сделать еще одну вещь — убедиться, что устройства, которым необходимо войти в ваш реестр, работают как основной пользователь:

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

Вариант 3 - использовать реальную оболочку

Если вы хотите делать что-то похожее на оболочку, вы всегда можете просто запустить оболочку и заставить ее выполнять то, что вам нужно.

ExecStartPre=/bin/sh -c '/usr/bin/docker login -e [email protected] -u bla -p xxxxx https://myregistry.example.com && /usr/bin/docker pull myregistry.example.com/foo'
person Paul Dixon    schedule 23.02.2015
comment
Спасибо! Как вы упомянули в IRC, можно также поместить ExecStartPre таким образом, если требуется цепочка: ExecStartPre=/bin/sh -c '/usr/bin/docker login -e [email protected] -u bla -p xxxxx https://myregistry.example.com && /usr/bin/docker pull myregistry.example.com/foo' - person mbo; 23.02.2015
comment
Да, я добавлю это к ответу для полноты - person Paul Dixon; 23.02.2015