Как получить доступ к хост-компьютеру из контейнера Docker?

У меня есть приложение, написанное на PHP, и мне нужно работать с хост-машиной: создать пользователя Linux, скопировать некоторые файлы и т. д.

Контейнеры изолированы от хоста, и вы можете думать о них как об отдельных компьютерах. Итак, как бы вы сделали то, что хотите, если бы вы запускали свой PHP на другом компьютере, а не на хосте? Это было бы беспорядочно, и мне кажется, что ваша задача плохо подходит для контейнеризации. Вероятно, вам следует запустить его непосредственно на хост-компьютере.

Hans Kilian 08.02.2023 09:05

Ответ, вероятно, можно найти здесь: stackoverflow.com/questions/24319662/…

vbourdouvalis 08.02.2023 09:06

Вы ищете доступ к файлам на хосте при создании образа или при его запуске? При сборке образа у вас есть доступ к контексту сборки [docs.docker.com/build/building/context/] , но при запуске образа вам нужно будет предоставить файлы/контент работающему образу путем их монтирования. в образ через том или подобное. [ docs.docker.com/storage/volumes/].

JohnXF 08.02.2023 09:31

@JohnXF при запуске изображения. Я редактирую через SSH и host.docker.internal.

Roman Grinyov 10.02.2023 03:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Запустите эту программу от имени пользователя 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.

Roman Grinyov 10.02.2023 03:10
Ответ принят как подходящий

Я редактирую через 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'

Другие вопросы по теме