为什么?
我正在尝试创建一个通用解决方案,用于在 Heroku 上运行 docker-compose。我想通过使用 Heroku Button 部署来制作一键部署解决方案。这样,用户不需要任何 git、Heroku cli 和 docker 知识。
问题。
码头工人和码头工人守护进程只可当我设置stack到container。有一些 buildpack 可以为您提供 docker 和 docker-compose CLI,但没有 docker 守护程序,您将无法运行 docker 映像。所以构建包将不起作用。
随着stack设置为container我可以使用文件heroku.yml(文章)。在那里我定义了我的流程。(它取代了Procfile。如果我仍然将 a 添加Procfile到我的项目中,它将什么也不做。)
我还可以定义一个Dockerfilethere 来构建我的 docker 映像。
但是,当我运行 docker 映像时,会弹出以下错误:
2019-02-28T15:32:48.462101+00:00 app[worker.1]: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
2019-02-28T15:32:48.462119+00:00 app[worker.1]:
2019-02-28T15:32:48.462122+00:00 app[worker.1]: If it's at a non-standard location, specify the URL with …Run Code Online (Sandbox Code Playgroud) 我正在我的项目中研究 GitLab CI,我创建了一个图像来进行我的测试和构建。当我在 docker executor 中运行它时,每个作业都需要从一开始就下载图像。我需要缓存层和拉取的图像以改善我的构建和部署时间(5 分钟,使用不安全选项最多 1 分钟)。
我搜索了多个链接和多个文章,很多人都有同样的问题。但是,GitLab 团队并没有解决这个问题。而且社区没有可靠且安全的解决方案。下面的链接遵循同样的问题:
最可能的方法(使用层缓存)是使用单独的容器并使运行器连接到它,并从中触发执行。这样,所有层都将位于“无限生命”容器中,并且不会在阶段结束时丢失所有缓存。考虑将docker.sock作为挂载公开的方法不仅不安全,而且在容器之间共享文件时也存在许多问题,因为它们都是兄弟姐妹,而不是共享卷的父子。
使用无限生命容器的方法如下所示:
docker run --privileged --name gitlab-dind -d --restart=always docker:19-dind --storage-driver=overlay2
Run Code Online (Sandbox Code Playgroud)
或者
docker network create gitlab-runner-net
docker run --privileged --name gitlab-runner-dind --network gitlab-runner-net --publish=2375:2375 --publish=2376:2376 -d docker:19-dind …Run Code Online (Sandbox Code Playgroud) 我在 docker 中设置了 docker 并尝试挂载文件夹。
假设我有那些我希望与他的父母共享的文件夹。在主机上,我在 /tmp/dind 中创建了一个名为foo. 主机启动容器1,启动容器2。这就是我想要的结果。
Host | Container 1 | Container 2
/tmp/dind | /tmp/dind2 | /tmp/dind3
<-------> <------->
Run Code Online (Sandbox Code Playgroud)
相反,我得到
Host | Container 1 | Container 2
/tmp/dind | /tmp/dind2 | /tmp/dind3
<------->
<----------------------->
Run Code Online (Sandbox Code Playgroud)
代码在这里:
docker run --rm -it \
-v /tmp/dind:/tmp/dind2 \
-v /var/run/docker.sock:/var/run/docker.sock docker sh -c \
"docker run --rm -it \
-v /tmp/dind2:/tmp/dind3 \
-v /var/run/docker.sock:/var/run/docker.sock \
docker ls /tmp/dind3"
Run Code Online (Sandbox Code Playgroud)
这不输出任何内容,而下一个命令给出 foo 作为结果。我改变了安装的卷:
docker run --rm -it \
-v /tmp/dind:/tmp/dind2 \ …Run Code Online (Sandbox Code Playgroud) 我有Harbor本地 docker 注册表,所有需要的图像都在那里,并将 GitLab 连接到 Harbour,所有图像都是从 Harbour 接收的,但是在 11 月 2 日之后,Docker 限制了拉取次数,似乎可以从 Docker 集线器拉取服务。是否可以使用 dind 服务从 Harbor 拉出?
管道输出:
Running with gitlab-runner 12.10.1 (ce065b93)
on docker_runner_7 WykGNjC6
Preparing the "docker" executor
30:20
Using Docker executor with image **harbor**.XXX.XXXX.net/library/docker_maven_jvm14 ...
Starting service docker:**dind** ...
**Pulling docker image docker:dind** ...
**ERROR**: Preparation failed: Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit (docker.go:198:2s)
Will be retried …Run Code Online (Sandbox Code Playgroud) 我有一个gitlab-ci.yml这样的:
build and push docker image:
stage: publish
variables:
DOCKER_REGISTRY: amazon-registry
AWS_DEFAULT_REGION: ap-south-1
APP_NAME: sample-app
DOCKER_HOST: tcp://docker:2375
image:
name: amazon/aws-cli
entrypoint: [""]
services:
- docker:dind
before_script:
- amazon-linux-extras install docker
script:
- docker build -t $DOCKER_REGISTRY/$APP_NAME:master .
- aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
- docker push $DOCKER_REGISTRY/$APP_NAME:master
Run Code Online (Sandbox Code Playgroud)
这一步需要 19=8 分钟才能完成,因为 docker 镜像步骤没有被缓存。我希望能够缓存 before_scriptamazon-linux-extras install docker以及我正在构建的 docker 映像。我们在自己的 gitlab runners 上运行。我已经搜索了答案,但找到了 4 年前的解决方案。有没有办法解决这个问题?另外,是否会放弃docker:dind帮助?
在配置gitlab-ci来构建docker镜像并将它们推送到我的gitlab不安全的注册表时,我遇到了一些错误.我的gitlab-ci.yaml如下:
stages:
- build
- deploy
variables:
GIT_SUBMODULE_STRATEGY: recursive
CONTAINER_IMAGE: XXX:$CI_COMMIT_REF_NAME
# The insecure-registry flag
services:
- docker:dind
build_container:
image: docker:latest
stage: build
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin
script:
- docker build --pull -t $CONTAINER_IMAGE .
- docker push $CONTAINER_IMAGE
Run Code Online (Sandbox Code Playgroud)
第一个错误是:
$ docker login -u gitlab-ci-token -p $CI_JOB_TOKEN myregistry.gitlab.com
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 …Run Code Online (Sandbox Code Playgroud)