高山:等待docker启动后再继续

时间:2019-01-10 11:21:18

标签: docker alpine

我在CI / CD机器上使用Alpine linux。下面的docker文件:

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 个答案:

答案 0 :(得分:1)

您显示的所有内容实际上都没有启动Docker守护进程(除了在主机上运行的守护进程之外)。

尝试在Docker中启动Docker是一个复杂且通常不建议使用的设置。 A long-time Docker dev specifically recommends not using it for CI;有一个docker罐头图像,其中官方图像描述的第一句话开始

  

尽管通常不建议在Docker内部运行Docker ....

您显示的Dockerfile不包含ENTRYPOINT或CMD指令。这意味着它将从node(刚刚运行node的{​​{3}})继承它。简而言之:运行此映像时,除非在命令行中指定其他内容,否则它将启动交互式Node.js Shell,而不是捆绑到同一映像中的任何不相关的工具。具体来说,它将启动Docker守护程序。

RUN service ... start放入Dockerfile并不能帮助您,原因有两个。一个是Docker映像仅包含文件系统内容,而不包含正在运行的进程,因此在RUN步骤完成后,不再运行任何内容。一些初始化系统(尤其是systemd)依赖于与初始化进程的通信,该进程也不会运行,因此尤其是Docker中的systemctl几乎永远无法工作。从结构上讲,通常最好在容器中运行一个进程(因此docker stop将停止您关心的进程,以便Docker会注意到该进程是否崩溃,进行扩展以及...),因此您应该永远不要在Docker中使用serviceinitctlsystemctl

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

答案 1 :(得分:1)

请考虑@DavidMaze的答案,据说DinD不是正确的方法,但我认为这似乎更容易...此外,我在AWS上找到了有关如何实现此功能的文档。

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

我了解的重点是我需要在CodeBuild上启用特权模式,然后在我的buildspec中,我需要做:

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"