Alpine:等待 docker 开始后再继续
Alpine: Wait for docker to start before continue
我正在为我的 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 开始呢?
您显示的任何内容实际上都没有启动 Docker 守护进程(除了主机上的 运行ning 守护进程)。
尝试在 Docker 中启动 Docker 是一个复杂且通常不推荐的设置。 A long-time Docker dev specifically recommends not using it for CI; there is a precanned docker 官方图片描述的第一句话开始的图片
Although running Docker inside Docker is generally not recommended....
您显示的 Docker 文件不包含 ENTRYPOINT 或 CMD 指令。这意味着它将从仅 运行 宁 node
的 node, which has a default CMD 继承它。简而言之:当您 运行 此图像时,除非您在命令行指定其他内容,否则它将启动交互式 Node.js shell,而不是您捆绑的任何无关工具成相同的图像。具体来说,它将 不会 启动 Docker 守护进程。
将 RUN service ... start
放入您的 Docker 文件中对您没有帮助,原因有几个。其一是 Docker 图像仅包含文件系统内容,而不包含 运行ning 进程,因此在 运行 步骤完成后,运行ning 不再是任何内容。一些 init 系统(尤其是 systemd)依赖于与 init 进程的通信,这也不会是 运行ning,所以特别是 Docker 中的 systemctl
几乎从不工作。在架构上,运行 容器中的一个进程通常更好(因此 docker stop
将停止您关心的进程,以便 Docker 会注意到进程是否崩溃,以及缩放,以及...) 所以你几乎不应该在 Docker.
中使用 service
、initctl
或 systemctl
CI 工具的一般建议是绑定安装主机的 Docker 套接字 (docker run -v /var/run/docker.sock:/var/run/docker.sock
) 并让它自己构建图像和启动容器,接受安全性影响。
请考虑@DavidMaze 的回答,据说 DinD 不是正确的方法,但我认为这似乎更容易……此外,我在 AWS 上找到了有关如何进行这项工作的文档。
https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker-custom-image.html
我学到的要点是我需要在 CodeBuild 上启用特权模式,然后在我的构建规范中,我需要做:
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"
我正在为我的 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 开始呢?
您显示的任何内容实际上都没有启动 Docker 守护进程(除了主机上的 运行ning 守护进程)。
尝试在 Docker 中启动 Docker 是一个复杂且通常不推荐的设置。 A long-time Docker dev specifically recommends not using it for CI; there is a precanned docker 官方图片描述的第一句话开始的图片
Although running Docker inside Docker is generally not recommended....
您显示的 Docker 文件不包含 ENTRYPOINT 或 CMD 指令。这意味着它将从仅 运行 宁 node
的 node, which has a default CMD 继承它。简而言之:当您 运行 此图像时,除非您在命令行指定其他内容,否则它将启动交互式 Node.js shell,而不是您捆绑的任何无关工具成相同的图像。具体来说,它将 不会 启动 Docker 守护进程。
将 RUN service ... start
放入您的 Docker 文件中对您没有帮助,原因有几个。其一是 Docker 图像仅包含文件系统内容,而不包含 运行ning 进程,因此在 运行 步骤完成后,运行ning 不再是任何内容。一些 init 系统(尤其是 systemd)依赖于与 init 进程的通信,这也不会是 运行ning,所以特别是 Docker 中的 systemctl
几乎从不工作。在架构上,运行 容器中的一个进程通常更好(因此 docker stop
将停止您关心的进程,以便 Docker 会注意到进程是否崩溃,以及缩放,以及...) 所以你几乎不应该在 Docker.
service
、initctl
或 systemctl
CI 工具的一般建议是绑定安装主机的 Docker 套接字 (docker run -v /var/run/docker.sock:/var/run/docker.sock
) 并让它自己构建图像和启动容器,接受安全性影响。
请考虑@DavidMaze 的回答,据说 DinD 不是正确的方法,但我认为这似乎更容易……此外,我在 AWS 上找到了有关如何进行这项工作的文档。
https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker-custom-image.html
我学到的要点是我需要在 CodeBuild 上启用特权模式,然后在我的构建规范中,我需要做:
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"