docker swarmでコンテナがPendingのままになる現象

dockerのswarm modeで、composefileを使ってコンテナをデプロイしようとしたときに、コンテナの実行状態がPendingから先に進まないという現象に出くわした。

環境はUbunu16.04 LTSにdocker-ce 17.09を入れた2台構成。 2台ともmanagerとして動作。

daemon.jsonには、

{
    "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という組み合わせ限定の現象なのかね。