标签: docker-in-docker

从GitLab CI运行器连接到docker-in-docker

我有一个我想要的GitLab管道:

  1. 构建Java应用程序
  2. 使用docker-compose进行测试
  3. 推送到我的Docker存储库

我遇到的主要问题是这是有效的:

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: docker:latest
  script:
  - docker version
Run Code Online (Sandbox Code Playgroud)

输出按预期打印:

> gitlab-ci-multi-runner exec docker --docker-privileged docker_test
...
$ docker version
Client:
 Version:      17.06.0-ce
...
Server:
 Version:      17.06.0-ce
...
Build succeeded
Run Code Online (Sandbox Code Playgroud)

虽然这没有(安装步骤docker-ce省略):

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest       << note change
  script:
  - docker version
Run Code Online (Sandbox Code Playgroud)

它失败了:

$ docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 …
Run Code Online (Sandbox Code Playgroud)

gitlab docker gitlab-ci docker-in-docker

16
推荐指数
1
解决办法
5935
查看次数

与Docker-in-Docker的Docker容器网络

我想使用docker-docker设置与父Docker容器中的子docker容器建立联系.

假设我正在尝试连接到一个简单的Apache httpd服务器.当我在主机上运行httpd容器时,一切正常:

asnyder:~$ docker run -d -p 8080:80 httpd:alpine
asnyder:~$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>
Run Code Online (Sandbox Code Playgroud)

但是当我从Docker-in-docker设置中执行相同操作时,我收到Connection refused错误:

asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 8080:80 httpd:alpine
/ # curl localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused
Run Code Online (Sandbox Code Playgroud)

我没有运气就尝试过几次改装.指定0.0.0.0界面:

asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker …
Run Code Online (Sandbox Code Playgroud)

networking docker docker-in-docker

14
推荐指数
2
解决办法
3299
查看次数

在 Docker 中预拉取 Docker 中的镜像 (dind)

我正在运行一个 docker-in-docker 容器,它始终使用相同的几个图像。我想将它们预先拉到我的 dind 容器中,这样我就不必在启动时拉它们。我怎样才能实现这一目标?

我正在考虑按照以下方式建立自己的沉闷形象

FROM docker:18.06.1-ce-dind

RUN apk update && \
    apk upgrade && \
    apk add bash

RUN docker pull pre-pulled-image:1.0.0
Run Code Online (Sandbox Code Playgroud)

显然,上面的 Dockerfile 不会构建,因为 docker 在构建期间没有运行,但它应该给出我想要实现的目标。

docker docker-in-docker

9
推荐指数
2
解决办法
5262
查看次数

如何使用 Docker 与 Kaniko 构建 Secret

语境

我们当前的构建系统在 docker 容器(Docker in Docker)内构建 docker 镜像。我们的许多 Docker 构建都需要凭据才能从私有工件存储库中提取。

我们已经使用 docker Secrets 处理了这个问题。将秘密传递给 docker build 命令,并在 Dockerfile 中,在需要的地方引用 RUN 命令中的秘密。这意味着我们正在使用 docker buildkit。 本文对此进行了解释。

我们正在迁移到不同的构建系统(GitLab),并且管理员已在 Docker 中禁用 Docker(安全原因),因此我们将迁移到Kaniko进行 docker 构建。

问题

Kaniko 似乎不像 docker 那样支持秘密。(没有命令行选项可以通过 Kaniko 执行器传递秘密)。

docker 构建所需的凭据存储在 GitLab 变量中。对于 DinD,您只需将这些变量作为秘密添加到 docker 构建中:

DOCKER_BUILDKIT=1 docker build . \
   --secret=type=env,id=USERNAME \
   --secret=type=env,id=PASSWORD \
Run Code Online (Sandbox Code Playgroud)

然后在 docker 中,使用秘密:

RUN --mount=type=secret,id=USERNAME --mount=type=secret,id=PASSWORD \
   USER=$(cat /run/secrets/USERNAME) \
    PASS=$(cat /run/secrets/PASSWORD) \
     ./scriptThatUsesTheseEnvVarCredentialsToPullArtifacts
...rest of build..
Run Code Online (Sandbox Code Playgroud)

如果没有 kaniko 执行器的 --secret 标志,我不确定如何利用 …

gitlab-ci docker-secrets docker-in-docker kaniko docker-buildkit

9
推荐指数
1
解决办法
4324
查看次数

在 Docker 场景中,在 Docker 中挂载 `/var/run/docker.sock` 的结果是什么?

我读过Can Anybodyterpret docker.sock来了解/var/run/docker.sock它的作用,但它在 GitLab CI 的Use Docker socket binding中的使用让我感到困惑。

这是他们的注册命令示例gitlab-runner

sudo gitlab-runner register -n \
  --url https://gitlab.com/ \
  --registration-token REGISTRATION_TOKEN \
  --executor docker \
  --description "My Docker Runner" \
  --docker-image "docker:19.03.12" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

我看到可以从两个地方获取生成的容器docker

  1. Unix 套接字/var/run/docker.sock
  2. docker包含在基础映像中的二进制文件docker:19.03.12

这不是PATH冲突吗?我认为应该是其中之一,我可以docker从主机的 unix 套接字或基本映像中获得使用的能力。

我认为--docker-image应该是ubuntu:latest或者不带有 的东西docker,因为已经来自主机套接字PATHdocker或者,可以移除 docker 套接字安装座。

关于 的双重包含,实际上发生了什么docker

unix-socket docker gitlab-ci gitlab-ci-runner docker-in-docker

8
推荐指数
1
解决办法
1万
查看次数

GitLab CI - 尝试使用 docker buildx 为 ARM64 构建

尝试docker buildx与 GitLabs 共享运行器一起使用来构建可以在我的 Raspberry Pi 上运行的 Docker 映像。作业失败,说 git 不在 PATH 中,但 git 安装在image: docker:stable-git. 任何已知的修复程序或更好的方法来构建兼容 ARM64 的映像,而无需在 Raspberry Pi 本身上构建?(由于 CPU 使用率,RPi 在其上构建时变得无法使用)

deploy:
  image: docker:stable-git
  stage: deploy
  services:
    - docker:dind
  before_script:
    - export DOCKER_BUILDKIT=1
    - export DOCKER_CLI_EXPERIMENTAL=enabled
    - docker build --platform=local -o . git://github.com/docker/buildx
    - mv buildx ~/.docker/cli-plugins/docker-buildx
  script:
    - docker buildx build --platform linux/amd64,linux/arm64 -t $CI_REGISTRY_IMAGE .
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE
Run Code Online (Sandbox Code Playgroud)
$ export DOCKER_BUILDKIT=1 …
Run Code Online (Sandbox Code Playgroud)

git gitlab docker gitlab-ci docker-in-docker

7
推荐指数
1
解决办法
3499
查看次数

在另一个 Docker 容器中无根运行 Docker 守护进程

根据 Docker 官方网站:https://docs.docker.com/engine/security/rootless/可以无根运行 Docker Daemon(没有 root 访问权限,没有 --privileged 标志)。

但是我确信从 Docker 容器内部运行时这将不起作用。如果没有 root 访问权限(--privileged),就无法进入modprobeDocker 容器。所以无法安装Docker无根脚本。

据说 Docker hub 中有一个官方镜像:docker:dind-rootlessimage here所以我将镜像拉入容器并通过 SSH 连接到容器中,但是在运行时出现以下错误dockerd

INFO[2020-07-17T20:50:32.355617100Z] Starting up dockerd needs to be started with root. To see how to run dockerd in rootless mode with unprivileged user, see the documentation

关于如何在另一个 Docker 容器中无根运行 Docker 守护进程有什么建议吗?我知道这可以用root来实现,但是有没有办法不用root呢?当我部署到 AWS fargate 时,我无法获得 root 访问权限,它不支持容器级别的特权访问。

docker docker-in-docker aws-fargate

7
推荐指数
1
解决办法
5151
查看次数

使用 docker-py 从现有容器运行 docker 容器

我有一个运行 Flask 应用程序的 Docker 容器。当 Flask 接收到 http 请求时,我想触发一个新的临时 Docker 容器的执行,该容器一旦完成它必须做的事情就会关闭。

我读过应该避免使用 Docker-in-Docker,因此这个新容器应该作为同级容器在我的主机上运行,​​而不是在 Flask 容器内运行。

使用docker-py执行此操作的解决方案是什么?

python flask docker dockerpy docker-in-docker

6
推荐指数
2
解决办法
2660
查看次数

gitlab-ci.yml &amp; docker-in-docker (dind) &amp; curl 在共享运行器上返回连接被拒绝

我正在尝试创建一个简单的 GitLab CI,在其中使用 docker-compose up 启动一个容器,然后尝试使用 curl 访问它,最后使用 docker-compose down 将其拆除。docker-compose up 旋转得非常好,我可以使用 docker ps -a 看到容器,但是当我卷曲时,我得到“连接被拒绝”。

这是我的 gitlab-ci.yml

image: docker

services:
 - docker:dind

before_script:
 - apk add --update python py-pip python-dev && pip install docker-compose
 - apk add --update curl && rm -rf /var/cache/apk/*

stages:
 - test

test:
 stage: test
 script:
  - docker-compose up -d
  - docker ps -a
  - curl http://localhost:5000/api/values
  - docker-compose down
Run Code Online (Sandbox Code Playgroud)

这是跑步者的日志

Image for service testwebapp was built because it did not already exist. To …
Run Code Online (Sandbox Code Playgroud)

curl docker gitlab-ci docker-compose docker-in-docker

6
推荐指数
1
解决办法
3991
查看次数

如何使用 Codebuild 构建 Docker 镜像?

我想从 Dockerfile 构建一个 docker 映像,并将该映像发布到 AWS ECR(Docker 注册表)。

为了成功,我需要能够访问docker builddocker push访问 Codebuild 容器,这是有问题的(在 docker 容器内安装 docker 会导致诸如 之类的错误Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?)。

请问要如何做这样的事情呢?有没有办法使用 codebuild 从 Dockerfile 构建 Docker 映像?

docker amazon-ecr aws-codebuild docker-in-docker

6
推荐指数
1
解决办法
9116
查看次数