docker-in-docker: как смонтировать bind / github / workspace в / foo? - PullRequest
0 голосов
/ 20 июня 2019

Я столкнулся со странным ограничением при запуске docker внутри docker (для целей тестирования) в Действиях GitHub .

(я знаю Я не должен запускать docker-in-docker (как parent-child), но запускаю docker-next-2-docker , и это равно что я делаю)

Я запускаю этот сценарий дважды; один раз я привязываю mount (mount bind?) /usr/local к /root, и один раз /github/workspace к /root. Как ни странно, первое работает, второе - нет.

Строительные блоки

Вот строительные блоки (также в этот репо готов к клонированию.

main.workflow

workflow "Run Docker in Docker" {
  on = "push",
  resolves = [
    "fails"
  ]
}

action "works" {
  uses = "./"
  env = {
    SOURCE_PATH = "/usr/local"
  }
}

action "fails" {
  uses = "./"
  env = {
    SOURCE_PATH = "/github/workspace"
  }
  needs = "works"
}

(в некоторой степени?) Эквивалентно, вы можете запустить ту же вещь локально с помощью github.sh:

#!/bin/sh

# this script replicates what github actions should do
docker build -t did .
echo "works"
docker run \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --env SOURCE_PATH="/usr/local" \
  did

echo "fails"
docker run \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --env SOURCE_PATH="/github/workspace" \
  did

(я знаю, что я обманываю здесь, потому что я не могу точно знать, как GitHub раскручивает образы действий, независимо от того, с отображением объема или нет).

Dockerfile

FROM github/docker-cli:master

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/sh

echo "this is the outer container"
mkdir -p $SOURCE_PATH
echo $SOURCE_PATH
ls $SOURCE_PATH
echo "this is the inner container"
docker run \
  --mount type=bind,source=$SOURCE_PATH,destination=/root \
  --entrypoint "/bin/ls" \
  --tty \
  github/docker-cli:master \
  /root

Результаты

Первое действие, в котором я связываю монтирование из SOURCE_PATH = "/usr/local" , работает как при запуске внутри действий GitHub, так и локально (и через act !).

Внешний и внутренний контейнеры выглядят одинаково на соответствующем переплете source и destination.

works
this is the outer container
/usr/local
bin
lib
share
this is the inner container
bin    lib    share

Но когда я устанавливаю SOURCE_PATH = "/github/workpace", я либо получаю (локально и через акт):

fails
this is the outer container
/github/workspace
this is the inner container
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /github/workspace.

или действия GitHub:

this is the outer container
/github/workspace
Dockerfile
entrypoint.sh
foo
github.sh
this is the inner container

Это означает, что target на самом деле пуст и некоторые странные вещи молча провалились.

Что особенного в /github/workspace? .

Пс .: Я делаю это, чтобы иметь возможность проверить действие GitHub, источник которого, очевидно, живет на /github/workspace, отсюда и неприятности.

...