Docker module - idempotence problem

Hi all!

I’ve found, that if run such command:

- docker: image=registry state=running

And then:

- docker: image=registry state=running`` env=``"SOMEVAR=1"

The module will return “ok”, not “changed” and docker container will not be relaunched with new parameters.
At first sight it may seem like this problem can be easily resolved by introducing some check in the module.
But if we think better we will find at least two problems:

  1. What the module should do with a container that was launched with old parameters?

  2. docker run registry -e "SOMEVAR=1" is a different call from just docker run registry, but the only way to inspect what environment variables in a container (AFAIK) is docker inspect -f "{{ .Config.Env }}" our_container and there will be some default environment variables as HOME. And also we need to ensure that there is no stale user-defined environment variables. So I don’t see any straight-forward ways to check if a container was launched with exact environment variables as defined in current version of playbook.

I want to discuss, what is the best way to make this module operate fully in idempotent fashion.

That parameter is probably intended to be set only at launch time, and is not so much an idempotence problem so much as it’s probably not changing anything.

Worth checking. Idempotence is a frequently misunderstood concept, which is why we try to not use the word very much.

It only means that repeated runs on the same thing to not introduce new effects F(x) = F(F(x)), it’s not so much about return codes.

Also, for completeness, please share the version of Ansible that you are using?

Thanks!

I use Ansible 1.7.1

Can you express your agumentation in application to the specific problem with docker module and evn. vars?

Regarding idempotence concept - seems like you right.

By the way I think I’ve found a workaround - instead of env. vars there is possible to use a config file, so it will be easier to check for changes, and whats regarding to issue 1) - I think it is possible to use container names for that and check specific names everytime - not random auto-generated by docker.