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

阿尔卑斯山:等待docker启动,然后继续,docker,alpine,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 openss

我正在为我的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登录
,它失败:

[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启动呢

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

尝试在Docker中启动Docker是一个复杂且通常不推荐的设置;在官方图像描述的第一句话开始的地方有一个预先准备好的图像

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

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

正在运行
服务。。。将
放入您的Dockerfile没有帮助,原因有两个。一个是Docker映像只包含文件系统内容,不运行进程,所以在运行步骤完成后,就不再运行任何东西了。一些init系统(尤其是systemd)依赖于与init进程的通信,而init进程也不会运行,因此Docker中的
systemctl
几乎无法工作。在体系结构上,通常最好在容器中运行一个进程(因此,
docker stop
将停止您关心的进程,并且docker将注意到进程是否崩溃,以及扩展,等等),因此您几乎不应该在docker中使用
服务
initctl
systemctl


对CI工具的一般建议是绑定主机的DockSocket(<代码> DockRun-V/Va/Run/Dock.Sock:/Va/Run/Dock.Sock< /Cord>),并让它自己构建图像并启动容器,接受安全性暗示。

< P>请考虑@ DaviMaZe的答案,假定DinD不是正确的方式,但我认为这似乎更容易。。。此外,我在AWS上找到了关于如何实现这一点的文档

我学到的关键点是我需要在代码构建上启用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"


对不起,我真的不明白如何设置这个。因此,我尝试添加行
docker run-v/var/run/docker.sock:/var/run/docker.sock
,但它说
“docker run”至少需要一个参数。
我猜这是图像。。。但我只是想建立我的docker形象在这种情况下,我怎么能做到这一点?举个例子会很好吗?经过更多的阅读,我想我需要这样做
docker run-v
指定我的CI映像,而不是在我的CI docker中这样做?如果是这样的话,我需要在我的CI平台(如CodeBuild或Jenkins)内完成。是否正确?
超时:无法识别选项:t