dockerのswarm modeで、composefileを使ってコンテナをデプロイしようとしたときに、コンテナの実行状態がPendingから先に進まないという現象に出くわした。
環境はUbunu16.04 LTSにdocker-ce 17.09を入れた2台構成。 2台ともmanagerとして動作。
{ "log-driver": "syslog" }
を指定しており、docker-compose.ymlは、
--- version: "3" services: server: image: nginx:alpine ports: - "80:80" logging: options: tag: server networks: public: networks: public: driver: overlay
という感じ。
この状態で、 docker stack deploy -c docker-compose.yml test
とやってコンテナをswarm cluster上にデプロイしようとすると、コンテナの状態がPendingのまま進まなくなる。
dockerdにデバッグフラグつけて実行するとかしても、特に問題はなさそうに見える。
しかしPendingから先に進まない。
原因がわかれば簡単な話なのだけど、どうやらswarm modeではlogging driverを指定せずにlogging optionsだけ指定すると上述の現象が発生するみたい。 これネット上に情報なくて、自分で検証したので骨でした。
なので、docker-compose.ymlを以下のように変更して、無事にコンテナの実行が行われました。
--- version: "3" services: server: image: nginx:alpine ports: - "80:80" logging: # logging driverを指定する driver: syslog options: tag: server networks: public: networks: public: driver: overlay
daemon.jsonでデフォルトのlogging driverを指定してたから、てっきりそれが使われるものだと思ってた。
実際、 docker service
コマンドからコンテナを起動すると意図通りに動いた。
swarm mode + composefileという組み合わせ限定の現象なのかね。