Я столкнулся со странным ограничением при запуске 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
, отсюда и неприятности.