我在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启动呢?
答案 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中使用service
,initctl
或systemctl
。
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"