如何在给定dockerfile的情况下启动带有舰队的码头工具?

时间:2015-06-16 23:40:38

标签: docker coreos systemd fleet

我只是尝试使用coreOS,docker和fleet。 我有下一个dockerfile:

FROM ubuntu:14.04

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install nginx

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN mkdir /etc/nginx/ssl
ADD default /etc/nginx/sites-available/default

EXPOSE 80

CMD ["nginx"]

我从这个文件中创建了一个图像(" nginx-example"),我可以用以下内容启动容器:

docker run -v /home/core/share:/var/www:rw -p 80:80 -d nginx-example

现在,我想用fleet启动它,所以我承诺我必须创建一个服务文件,然后用fleet启动它。

所以我尝试创建de服务文件(nginx1.service):

[Unit]
Description=MyTry
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStartPre=/usr/bin/docker pull nginx-example
ExecStart=/usr/bin/docker docker run -p 80:80 -d nginx-example  
ExecStop=/usr/bin/docker stop nginx

我提交并启动它,但是当我这样做时:

fleetctl list-units
nginx1.service  cbbed2c1.../IP  failed      failed

我无法运行Web服务器。 我认为问题出在服务文件中,但我不知道如何构建它。 谢谢。

3 个答案:

答案 0 :(得分:1)

您不应该以守护进程模式(-d)启动容器:

  

"如果您要修改这些单位,请务必不要复制   docker run命令以分离模式(-d)启动容器。   独立模式不会作为该单元的pid的子项启动容器。   这将导致设备运行几秒钟然后退出。"

https://coreos.com/docs/launching-containers/launching/fleet-example-deployment/#service-files

答案 1 :(得分:1)

这有效:

[Service]
TimeoutStartSec=0
ExecStartPre=/usr/bin/docker pull kimberlybf/nginx-example:latest
ExecStart=/usr/bin/docker run -p 80:80 -d --name nginx kimberlybf/nginx-example:latest

我将我的图像推送到DockerHub。

答案 2 :(得分:0)

这是您的服务文件中的一个关键行,可以让您思考:

ExecStartPre=/usr/bin/docker pull nginx-example

你认为这张图片是从哪里拉出来的? 为了图像,您需要首先推送到某处。最简单的当然是DockerHub。您需要创建一个帐户。我将继续为您创建帐户,存储库和配置身份验证,因为文档随时可用here

现在,如果您只是尝试docker push nginx-example,它就会失败,因为它需要通过标记与您的用户帐户的命名空间相关联。为了这个答案,我们假设您的帐户是kimberlybf

$ docker tag nginx-example:latest kimberlybf/nginx-example:latest - 这会正确标记您的图像,以便推送到DockerHub。

$ docker push kimberlybf/nginx-example:latest - 这实际上会推动您的形象。该图片将是公开的,因此请勿将任何敏感数据放入您的配置中。

然后你会修改你的Service,并相应地更换容器标签,同时记住给你的容器命名,例如:

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStartPre=/usr/bin/docker pull kimberlybf/nginx-example:latest
ExecStart=/usr/bin/docker docker run -p 80:80 -d --name nginx kimberlybf/nginx-example:latest
ExecStop=/usr/bin/docker stop nginx