У меня есть приложение, написанное на PHP, и мне нужно работать с хост-машиной: создать пользователя Linux, скопировать некоторые файлы и т. д.
Ответ, вероятно, можно найти здесь: stackoverflow.com/questions/24319662/…
Вы ищете доступ к файлам на хосте при создании образа или при его запуске? При сборке образа у вас есть доступ к контексту сборки [docs.docker.com/build/building/context/] , но при запуске образа вам нужно будет предоставить файлы/контент работающему образу путем их монтирования. в образ через том или подобное. [ docs.docker.com/storage/volumes/].
@JohnXF при запуске изображения. Я редактирую через SSH и host.docker.internal
.
Запустите эту программу от имени пользователя root вне контейнера в хост-системе.
Одной из основных особенностей Docker является то, что контейнеру обычно не разрешается, например, сбрасывать пароль пользователя root хоста, написав /etc/shadow
, или вообще читать или записывать файловую систему хоста. Контейнеру также обычно запрещается выполнять другие задачи управления системой, такие как изменение конфигурации хост-сети. Эта изоляция файловой системы, не позволяющая процессу-контейнеру повредить ключевые системные файлы, является основной причиной использования Docker, и ее нельзя просто отключить.
Так, в частности, «создать пользователя» — это как раз тот класс опасных для хоста операций, которые процесс-контейнер по своей конструкции запрещает выполнять. В более общем смысле «копировать файлы» просто сложно, но задачу, основной целью которой является чтение и запись хост-файлов, гораздо проще выполнить вне контейнера.
Теоретически вы можете выполнить некоторые из этих задач, используя крепления для привязки. Для части задачи «копировать файлы» в принципе вы можете запустить что-то вроде
docker run --rm \
-v "$PWD/here:/input" \
-v "$PWD/there:/output" \
your-image
а в контейнере /input
и /output
будут директориями ./here
и ./there
хоста.
Например, можно смонтировать всю файловую систему хоста -v /:/host
. Теоретически вы можете использовать это для редактирования /host/etc/passwd
или, возможно, даже для chroot (8) обратно в хост-систему и эффективно выйти из контейнера. Но на данный момент вы не получаете особой пользы от Docker, и будет намного проще запускать задачу вне контейнера.
Я редактирую через SSH и host.docker.internal
.
Я редактирую через SSH и host.docker.internal
:
Докерфайл:
RUN apt-get update && apt-get upgrade -y && apt-get install -y ssh
# ...
COPY ./.ssh /root/.ssh
RUN chmod 700 /root/.ssh && chmod 644 /root/.ssh/* && chmod 600 /root/.ssh/id_rsa
докер-compose.yml:
extra_hosts:
- 'host.docker.internal:host-gateway'
Контейнеры изолированы от хоста, и вы можете думать о них как об отдельных компьютерах. Итак, как бы вы сделали то, что хотите, если бы вы запускали свой PHP на другом компьютере, а не на хосте? Это было бы беспорядочно, и мне кажется, что ваша задача плохо подходит для контейнеризации. Вероятно, вам следует запустить его непосредственно на хост-компьютере.