代码之家  ›  专栏  ›  技术社区  ›  Jiew Meng

阿尔卑斯山:等待docker启动,然后继续

  •  2
  • Jiew Meng  · 技术社区  · 7 年前

    FROM node:10.15-alpine
    RUN npm i -g sequelize sequelize-cli mysql2
    RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
    RUN apk update
    RUN apk add --update git bash openssh terraform aws-cli docker openrc
    WORKDIR /var/app
    

    问题是当CI试图执行docker代码时,例如。 docker login ,它失败了:

    [Container] 2019/01/10 11:18:10 Running command $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
     [Container] 2019/01/10 11:18:10 Command did not exit successfully $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) exit status 1
    

    RUN service docker start
    

    我让docker已经开始了

    我怎么能等docker启动呢?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Jiew Meng    7 年前

    一定要考虑@大卫的回答,据称DinD不是正确的方式,但我觉得似乎更容易…此外,我在AWS上找到了关于如何实现这一点的文档。

    https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker-custom-image.html

    我学到的关键点是我需要在代码构建上启用Priviledge模式,然后在我的构建规范中,我需要做:

    phases:
      install:
        commands:
          - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2&
          - timeout -t 15 sh -c "until docker info; do echo .; sleep 1; done"
    
    
        2
  •  1
  •   David Maze    7 年前

    您显示的任何内容都不会实际启动Docker守护程序(主机上运行的守护程序除外)。

    尝试在Docker中启动Docker是一个复杂且通常不推荐的设置。 A long-time Docker dev specifically recommends not using it for CI ; 有一个预先计划好的计划 docker

    虽然通常不建议在Docker中运行Docker。。。。

    显示的Dockerfile不包含入口点或CMD指令。这意味着它将从 node 哪一个 has a default CMD node . 简而言之:运行此映像时,除非在命令行中指定其他内容,否则它将启动一个交互式Node.js shell,而不是任何捆绑到同一映像中的无关工具。具体来说,它将 启动Docker守护进程。

    RUN service ... start 进入Dockerfile对您没有帮助,原因有二。一个是Docker映像只包含文件系统内容,不运行进程,所以在运行步骤完成后,就不再运行任何东西了。一些init系统(特别是systemd)依赖于与init进程的通信,而init进程也不会运行,所以特别是 systemctl 在Docker中,几乎从来都不起作用。从架构上讲,在一个容器中运行一个进程通常更好(所以 docker stop service , initctl 系统控制 在码头。

    CI工具的一般建议是绑定挂载主机的Docker套接字( docker run -v /var/run/docker.sock:/var/run/docker.sock )并让它自己构建图像和启动容器,接受安全隐患。

    推荐文章