CoreOS:如何在Cloud-config中设置Docker容器的依赖关系?

我有一个基本的cloud-config.yamlcloud-config.yaml上运行四个容器(直接,没有集群)。 两个容器( nginx-gennginx-letsencrypt )从名为nginx的容器中挂载卷。 每个容器启动都被定义为一个systemd单元。

我已经添加了After=Requires=依赖关系,但是在首次login时,我迎接:

 CoreOS stable (1185.5.0) Failed Units: 2 letsencrypt.service nginx-gen.service 

nginx (提供音量的那个)正在运行。

如果之后我执行:

 sudo systemctl start nginx-gen.service sudo systemctl start letsencrypt.service 

他们开始和正确运行,所以我想这个问题是在系统启动依赖。

我没有CoreOS和systemd的经验,所以原因可能是非常基本的(比如在Docker容器实际运行之前获得“完整”状态的单元)。

看着journalctl日志,事实上nginx-gen服务在它有机会从nginx挂载卷之前就失败了:

 ... Jan 02 14:35:47 core-01 systemd[1]: nginx-gen.service: Failed with result 'start-limit-hit'. ... Jan 02 14:36:03 core-01 docker[1401]: Status: Downloaded newer image for nginx:latest ... 

我能做些什么来解决这个问题?


我的cloud-config.yaml

 #cloud-config write_files: # omitted for ServerFault: ensure template file # https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl) # and directories (/path/to/templates, /path/to/certs) are in-place coreos: units: - name: nginx.service command: start content: | [Unit] Description=Generic Nginx container [Service] Restart=always ExecStart=/usr/bin/docker run --name nginx -p 80:80 -p 443:443 -v /etc/nginx/conf.d -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /path/to/certs:/etc/nginx/certs:ro nginx ExecStop=/usr/bin/docker rm -f nginx - name: nginx-gen.service command: start content: | [Unit] Description=Docker-gen service for Nginx After=nginx.service Requires=nginx.service [Service] Restart=always ExecStart=/usr/bin/docker run --name nginx-gen --volumes-from nginx -v /path/to/templates:/etc/docker-gen/templates -v /path/to/certs:/etc/nginx/certs:ro -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf ExecStop=/usr/bin/docker rm -f nginx-gen - name: letsencrypt.service command: start content: | [Unit] Description=Ngnix reverse proxy Letsencrypt companion After=nginx.service Requires=nginx.service [Service] Restart=always ExecStart=/usr/bin/docker run --name nginx-letsencrypt -e "NGINX_DOCKER_GEN_CONTAINER=nginx-gen" --volumes-from nginx -v /path/to/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro jrcs/letsencrypt-nginx-proxy-companion ExecStop=/usr/bin/docker rm -f nginx-letsencrypt 

根据http://container-solutions.com/running-docker-containers-with-systemd/ ,您需要强制在Docker服务之后启动这些容器。

样品:

 [Unit] Description=Redis Container After=docker.service Requires=docker.service [Service] TimeoutStartSec=0 Restart=always ExecStartPre=-/usr/bin/docker stop %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull redis ExecStart=/usr/bin/docker run --rm --name %n redis [Install] WantedBy=multi-user.target 

所以在你的情况下,添加Requires = docker.service到你的nginx单元的Unit部分应该这样做,并且可能为你的每个单元添加一个WantedBy,所以SystemD知道运行它们。