Файл изменений Docker в контейнере

Обновлено: 03.07.2024

Утилита docker cp копирует содержимое SRC_PATH в DEST_PATH . Вы можете копировать из файловой системы контейнера на локальную машину или наоборот, из локальной файловой системы в контейнер. Если для SRC_PATH или DEST_PATH указано -, вы также можете передать tar-архив из STDIN или в STDOUT. CONTAINER может быть запущенным или остановленным контейнером. SRC_PATH или DEST_PATH может быть файлом или каталогом.

Команда docker cp предполагает, что пути к контейнерам указаны относительно каталога / (корневого) контейнера. Это означает, что ввод начальной косой черты необязателен; Команда видит сострадательный_дарвин:/tmp/foo/myfile.txt и сострадательный_дарвин:tmp/foo/myfile.txt как идентичные. Пути к локальному компьютеру могут быть абсолютными или относительными. Команда интерпретирует относительные пути локального компьютера как относительные к текущему рабочему каталогу, в котором запускается docker cp.

Команда cp ведет себя так же, как команда Unix cp -a, в которой каталоги рекурсивно копируются с сохранением разрешений, если это возможно. Право собственности устанавливается для пользователя и основной группы в месте назначения. Например, файлы, скопированные в контейнер, создаются с UID:GID пользователя root. Файлы, скопированные на локальный компьютер, создаются с использованием UID:GID пользователя, вызвавшего команду docker cp. Однако, если вы укажете параметр -a, docker cp установит права собственности на пользователя и основную группу в источнике. Если вы укажете параметр -L, docker cp следует любой символической ссылке в SRC_PATH. docker cp не создает родительские каталоги для DEST_PATH, если они не существуют.

Предполагая, что разделитель пути / , первый аргумент SRC_PATH и второй аргумент DEST_PATH , поведение будет следующим:

  • SRC_PATH указывает файл
    • DEST_PATH не существует
      • файл сохраняется в файле, созданном в DEST_PATH
      • Условие ошибки: каталог назначения должен существовать.
      • целевой файл перезаписывается содержимым исходного файла
      • файл копируется в этот каталог, используя базовое имя из SRC_PATH
      • DEST_PATH не существует
        • DEST_PATH создается как каталог, и содержимое исходного каталога копируется в этот каталог
        • Ошибка: невозможно скопировать каталог в файл
        • SRC_PATH не заканчивается на /. (то есть: косая черта, за которой следует точка)
          • исходный каталог копируется в этот каталог
          • содержимое исходного каталога копируется в этот каталог

          Эта команда требует, чтобы SRC_PATH и DEST_PATH существовали в соответствии с приведенными выше правилами. Если SRC_PATH является локальным и является символической ссылкой, по умолчанию копируется символическая ссылка, а не цель. Чтобы скопировать цель ссылки, а не ссылку, укажите параметр -L.

          Двоеточие ( : ) используется в качестве разделителя между CONTAINER и его путем. Вы также можете использовать : при указании путей к SRC_PATH или DEST_PATH на локальном компьютере, например, file:name.txt. Если вы используете : в пути к локальному компьютеру, вы должны указать относительный или абсолютный путь, например:

          Невозможно скопировать определенные системные файлы, такие как ресурсы в каталогах /proc , /sys , /dev , tmpfs и объекты монтирования, созданные пользователем в контейнере. Однако вы все равно можете скопировать такие файлы, вручную запустив tar в docker exec. Оба следующих примера делают одно и то же по-разному (считайте, что SRC_PATH и DEST_PATH — это каталоги):

          Использование - поскольку SRC_PATH передает содержимое STDIN в виде tar-архива. Команда извлекает содержимое tar в DEST_PATH в файловой системе контейнера. В этом случае DEST_PATH должен указывать каталог. Использование - as DEST_PATH передает содержимое ресурса в виде tar-архива в STDOUT .

          Теперь мне нужно отредактировать файл, а внутри у меня нет редакторов:

          Как редактировать файлы?



          так почему бы не создать файл Dockerfile, включить команду apt-get install и создать свой собственный контейнер? Контейнер Docker спроектирован так, а не по-вашему.

          18 ответов 18

          Как и в комментариях, редактора по умолчанию не установлено — странно — переменная окружения $EDITOR пуста. Вы можете войти в контейнер с помощью:

          Или используйте следующий Dockerfile:

          Образы Docker поставляются обрезанными до минимума, поэтому с поставляемым контейнером не устанавливается редактор. Вот почему необходимо установить его вручную.

          ИЗМЕНИТЬ

          Я также рекомендую вам прочитать мой пост на эту тему.


          Возможно, вы могли бы рассмотреть возможность установки редактора не в каждом контейнере, к которому вы подключаетесь, а только один раз на хост-компьютере Docker. Как упоминали другие комментаторы, вы можете смонтировать том, чтобы вы могли редактировать файлы, которые будут смонтированы, или перейти к самим данным контейнера и отредактировать файлы в /var/lib/docker/

          Я просто хотел изменить одну конфигурацию с true на false в контейнере. apt-get не работал из-за проблемы с разрешением внутри контейнера, поэтому я попробовал sed -i 's/texttobechanged/textwanted/g' имя файла. Мне помогло.

          Если вы не хотите добавлять редактор только для того, чтобы внести несколько небольших изменений (например, изменить конфигурацию Tomcat), вы можете просто использовать:

          который копирует его на ваш локальный компьютер (в ваш текущий каталог). Затем отредактируйте файл локально с помощью вашего любимого редактора, а затем выполните

          для замены старого файла.


          @Igor На самом деле это должно быть приемлемым решением, поскольку это правильный способ сделать это без добавления дополнительных пакетов в ваш контейнер, а добавление пакетов должно быть второстепенным решением.

          Для платформ Windows можно использовать, например: docker cp :C:\inetpub\wwwroot\Web.config . и docker cp Web.config :C:\inetpub\wwwroot\Web.config .

          А что порекомендуете для производства? Должны ли люди интерактивно редактировать файлы в контейнере в рабочей среде?

          Стоит отметить, что этот метод меняет владельца файла. Возможно, но это немного неудобно, чтобы потом изменить его обратно, войдя в контейнер от имени пользователя root ( docker exec -u 0 -it mycontainer bash ), а затем выполнив команду chown.

          Вы можете использовать cat, если он установлен, что, скорее всего, будет иметь место, если это не голый/сырой контейнер. Это работает в крайнем случае и нормально при копировании + вставке в соответствующий локальный редактор.

          cat будет выводить каждую строку при получении новой строки. Не забудьте добавить новую строку для этой последней строки. ctrl-c отправляет SIGINT, чтобы кошка вышла корректно. Из комментариев вы видите, что вы также можете нажать ctrl-d, чтобы обозначить конец файла ("больше не поступает ввод").

          Ctrl+D лучше, чем Ctrl+C . ctrl+D отправляет EOF. Вам не нужно добавлять дополнительную новую строку в конце. С помощью Ctrl+C, если вы забудете добавить новую строку, вы потеряете последнюю строку!

          При создании образов Docker вы указываете контекст сборки для образа. Контекст сборки образа содержит все файлы, которые вы хотите включить в контейнер, которым вы будете из этого образа. Это включает в себя исходный код вашего приложения, Dockerfile, другие системные файлы и т. д. После того как вы указали расположение контекста сборки с помощью команды сборки Docker, вы можете создать образ.

          Кроме того, вы можете использовать инструкцию COPY внутри Dockerfile или даже команду Docker cp для копирования файлов внутри контейнера с локального компьютера. Но что, если вы хотите отредактировать файл внутри контейнера? Проще говоря, могут быть ситуации, когда вы получили доступ к оболочке или bash контейнера и хотите редактировать файлы внутри контейнера. В этой статье мы обсудим, как именно это сделать.

          Для начала вам нужно сначала создать изображение, чтобы при создании контейнера, связанного с этим изображением, у вас был доступ к текстовому файлу внутри контейнера. Есть два способа сделать это. Либо вы можете напрямую использовать инструкцию COPY в Dockerfile, либо создать файл непосредственно внутри контейнера.

          Давайте создадим и запустим контейнер Ubuntu.

          В приведенной выше команде запуска Docker мы использовали параметры -i и -t, которые означают интерактивный и псевдо-TTY. Эти параметры позволяют нам взаимодействовать с контейнером, предоставляя входные данные. Затем мы использовали команду /bin/bash, которая устанавливает команду по умолчанию, которая будет выполняться сразу после запуска контейнера. Таким образом, когда мы запустим указанную выше команду, у нас будет доступ к bash контейнера ubuntu.

          Вы даже можете убедиться, что контейнер активно работает, перечислив все активные контейнеры. Оставив этот контейнер bash запущенным в терминале, откройте новый терминал и выполните следующую команду.

          Вы обнаружите, что созданный вами контейнер mycont активно работает.

          Получив доступ к bash контейнера, вы можете взаимодействовать с ним так же, как с терминалом Linux/Ubuntu. Чтобы создать файл, мы можем использовать сенсорную команду

          Вы можете выполнить эту команду внутри bash контейнера.

          Чтобы проверить создание файла, вы можете просмотреть все его содержимое.

          Если вы хотите отредактировать файл внутри контейнера, вам потребуется доступ к редактору файлов. Вы можете использовать nano или установить пакет vim внутри контейнера. Прежде чем сделать это, убедитесь, что вы обновили контейнер

          Теперь вы можете установить пакет vim с помощью следующей команды.

          Теперь откройте файл с помощью редактора vim. Для этого вы можете использовать приведенную ниже команду.

          Чтобы вставить содержимое в файл, необходимо активировать режим вставки. Просто нажмите клавишу i на клавиатуре. Затем введите любой контент, который вы хотите. Чтобы сохранить содержимое, нажмите клавишу ESC, чтобы выйти из режима вставки, введите :q и нажмите Enter, чтобы сохранить и выйти.

          Для проверки используйте команду cat, чтобы распечатать содержимое файла.

          Таким образом, вы можете использовать любой редактор по вашему выбору для редактирования файлов внутри контейнера.

          Если у вас уже есть контейнер, работающий в фоновом режиме, вы даже можете использовать команду Docker exec, чтобы получить доступ к bash контейнера.

          Повторите описанные выше шаги для создания и редактирования файлов.

          Еще один способ сделать это, и, вероятно, лучший, — установить редактор vim напрямую с помощью Dockerfile. Вы можете сделать это с помощью инструкции RUN. Давайте проверим это. Рассмотрим Dockerfile ниже.

          По умолчанию при извлечении образа Ubuntu вы не найдете никакого текстового редактора. Следовательно, вам нужно установить его вручную. Инструкция COPY скопирует все файлы в рабочий каталог контейнера по умолчанию из текущего каталога на вашем хост-компьютере. После того как вы выполнили команду сборки Docker для этого файла Docker для создания образа, вы можете запустить контейнер с помощью команды запуска Docker.

          При этом вы получите доступ к контейнеру bash с уже установленным редактором vim.


          Джеймс Уокер


          Джеймс Уокер
          Сотрудник CloudSavvy

          Джеймс Уокер (James Walker) – сотрудник CloudSavvy в области ИТ. Он является основателем Heron Web, где предоставляет индивидуальные услуги по разработке программного обеспечения для малого и среднего бизнеса, специализируясь на веб-приложениях и API. Он имеет опыт работы с полным жизненным циклом разработки и работает с технологиями DevOps, такими как GitLab, Docker и Kubernetes. Подробнее.

          Графика, показывающая значок кода Visual Studio

          Разработка или отладка кода внутри контейнеров Docker может оказаться непростой задачей. Обычно вы подключаетесь к контейнеру и используете утилиты оболочки для редактирования файлов. Расширение Visual Studio Code Remote Containers позволяет открывать папки внутри контейнеров, чтобы вы могли работать с ними в редакторе кода.

          Удаленная разработка работает с Docker Desktop 2.0 и выше для Windows и macOS, а также с Docker Engine 18.06 и выше для Linux. Если вы используете Windows 10 Домашняя, у вас должны быть установлены обновление от апреля 2020 г., Docker Desktop 2.3 и подсистема Windows для Linux.

          Что касается контейнеров, VS Code совместим как с контейнерами x64, так и с контейнерами ARM. Вы можете использовать операционные системы Alpine, Debian, Ubuntu, CentOS и RHEL. Если ваш базовый образ не работает из коробки, вы сможете установить внутри него дополнительные пакеты для завершения подключения.

          Начало работы

          Запустите VS Code, нажмите Ctrl+Shift+P и найдите «расширения». Выберите элемент «Установить расширения», чтобы открыть боковую панель. На панели расширений найдите «Remote — Containers» и установите соответствующий элемент.


          После установки расширения в левом нижнем углу строки состояния появится новая зеленая кнопка. Нажмите эту кнопку, чтобы открыть палитру команд, предварительно заполненную доступными удаленными командами. Если вы предпочитаете избегать использования мыши, вы также можете найти команды, нажав Ctrl+Shift+P и набрав «remote». Расширение будет отображаться и в других областях пользовательского интерфейса, таких как страница приветствия и панель открытия папки.


          Чтобы открыть первую папку Dockerized, откройте список команд и выберите «Присоединить к работающему контейнеру». Вам нужно будет подтвердить предупреждение о том, что контейнер может выполнять ненадежный код. Вы должны присоединяться только к контейнерам, созданным из образов, которым вы доверяете, так как вредоносный контейнер с файлом рабочей области VS Code может поставить под угрозу вашу систему.


          VS Code отобразит список контейнеров Docker, работающих в вашей системе. Выберите контейнер, к которому хотите подключиться. Запустится новое окно. Запуск может занять несколько секунд, пока VS Code устанавливает компоненты удаленного сервера в контейнер. Вы увидите активный контейнер в левом нижнем углу строки состояния.

          Когда окно будет готово, можно приступать к работе.Нажмите кнопку «Открыть папку» на левой панели, чтобы открыть окно выбора файлов. Это отображает файловую систему внутри контейнера. Перейдите в каталог, который вы хотите открыть, и нажмите «ОК».


          Боковая панель обновится, чтобы отобразить содержимое выбранного каталога. Щелкните любой из файлов, чтобы открыть его в редакторе VS Code. Теперь вы можете вносить изменения внутри контейнера, не копируя файлы вручную и не настраивая привязку рабочего каталога. Это максимально повышает эффективность при использовании Dockerized среды разработки или отладке неисправного контейнера.


          Доступен полный набор функций VS Code, включая автодополнение кода IntelliSense и набор инструментов для отладки. Панели, такие как консоль и терминал, будут присоединены к потокам ввода и вывода контейнера.

          Как это работает?

          Первое, что нужно знать об интеграции, это то, что VS Code изменит файловую систему вашего контейнера. В контейнерах, к которым вы подключаетесь, устанавливается сервер, который передает информацию клиенту редактора.

          Диаграмма, показывающая архитектуру расширения удаленных контейнеров Visual Studio Code

          Сервер отслеживает файловую систему, читает файлы и запускает процессы внутри контейнера. Это поддерживает такие возможности, как отладчик VS Code. Редактор попросит сервер запустить исходный код, позволив ему проверить код, работающий внутри контейнера.

          Аналогичным образом VS Code установит копии ваших других расширений внутри контейнера. Это гарантирует, что они получат полный доступ к файловой системе контейнера, поэтому они будут работать без расхождений по сравнению с локальной папкой. Конечным результатом является полноценный редактор, который работает прозрачно, даже если он распределен по вашему хосту и контейнерам. В зависимости от размера вашей среды первоначальная установка может занять некоторое время, но сервер контейнера будет кэширован для последующего использования.

          Контейнеры разработки

          Помимо открытия файлов в существующем контейнере, удаленная система позволяет вам определять контейнеры разработки, которые инкапсулируют вашу рабочую среду. Такой контейнер должен включать в себя все программные зависимости, которые вы устанавливаете перед локальной разработкой приложения.

          При использовании контейнера разработки вы можете либо привязать монтирование к своему рабочему каталогу, либо использовать изолированный том. Последний вариант позволяет избежать загрязнения файловой системы и обеспечивает повышенную производительность, поскольку он больше подходит для Docker.

          Контейнеры разработки создаются из файлов .devcontainer/devcontainer.json. Они описывают конфигурацию Docker и Visual Studio, которая запускает вашу среду разработки.

          Показанный выше файл devcontainer.json настраивает контейнер разработки, использующий шаблон Microsoft Node.js. Расширение EditorConfig VS Code включено, добавляя поддержку файлов .editorconfig в вашем рабочем каталоге. Затем порт 3000 сопоставляется с хоста в контейнере.

          Файлы-контейнеры разработки также поддерживают несколько других параметров. Вы можете задать значения VS Code settings.json, добавить команду для запуска внутри контейнера и определить пользователя, от имени которого будет работать сервер VS Code.

          Если вы не хотите создавать файл конфигурации контейнера самостоятельно, команда Remote-Containers: Add Development Configuration Files автоматически добавит его в ваш проект. Вы сможете выбрать из списка предварительно настроенных шаблонов, которые вы сможете настроить позже.

          После того как в проекте появится файл devcontainer.json, запустите команду Remote-Containers: Rebuild Container из палитры команд. Это создаст образ контейнера с использованием указанной конфигурации. Когда сборка завершится, запустите Remote-Containers: Reopen Folder in Container, чтобы открыть текущий локальный каталог в новом контейнере разработки.

          Если вы используете репозиторий Git, обычно проще клонировать репозиторий непосредственно в контейнер. Команда Remote-Containers: Clone Repository in Container Volume принимает URL-адрес Git для клонирования. Он создаст новый том и прикрепит его к экземпляру контейнера разработки. Это позволяет вам работать с репозиториями Git, не клонируя их в локальную файловую систему, избегая ненужного загрязнения. VS Code автоматически передает контейнеру ваши локальные учетные данные Git.

          Настройка расширения

          Расширение Remote — Containers содержит несколько параметров, позволяющих настроить взаимодействие с контейнером. Вы можете найти их с помощью команды Remote-Containers: Settings for Remote-Containers.

          Первый набор параметров касается файлов точек.Точечные файлы относятся к файлам конфигурации, которые начинаются с точки ( . ). Удаленные контейнеры могут автоматически клонировать репозиторий точечных файлов Git в новые контейнеры, помогая вам начать работу с вашими обычными настройками.

          Добавьте URL-адрес репозитория dotfiles в настройки репозитория. Репозиторий будет клонирован по целевому пути, который по умолчанию ~/dotfiles. Если вы хотите запустить команду после того, как репозиторий будет клонирован, укажите ее как Install Command .


          Remote-Containers по умолчанию использует docker в качестве двоичного файла, который выполняет команды контейнера. Вы можете изменить это на любой двоичный файл, совместимый с Docker CLI, с помощью параметра Docker Path. Если вы используете Podman, указав podman в качестве этого значения, вы сможете работать с его контейнерами с помощью VS Code.

          Вы можете настроить удаленные расширения по умолчанию в разделе «Расширения по умолчанию». Нажмите «Добавить элемент», чтобы выбрать расширение для добавления в каждый контейнер. Это позволяет обеспечить глобальную доступность ваших обязательных расширений, даже если они не указаны в файле devcontainer.json.

          Последняя группа настроек касается конфигурации Git. Когда установлен флажок «Копировать Git Config», ваш локальный файл .gitconfig будет автоматически скопирован в контейнеры автоматически. Включение этого параметра гарантирует, что ваши коммиты будут правильно соотнесены с данными пользователя, которые вы уже используете локально.

          Настройка «Местоположение конфигурации Git Credential Helper» определяет файл конфигурации, в который будут записываться новые учетные данные Git. Вы можете выбрать из своего локального файла для каждого пользователя, ~/.gitconfig , или глобального расположения системы, /etc/gitconfig .

          Обзор

          Расширение Remote – Containers для Visual Studio Code позволяет редактировать файлы и папки внутри контейнеров Docker. Он без проблем работает с функциями редактора VS Code, включая IntelliSense, индексацию каталогов, отладку и расширения. Внутри VS Code запускает сервер разработки внутри контейнера, поэтому его инструменты имеют полный доступ к файловой системе, с которой они работают.

          Существует несколько возможных вариантов использования этой функции, в том числе Dockerized среды разработки и оперативное редактирование контейнеров. Хотя идея использования контейнеров для систематизации разработки существует уже некоторое время, VS Code значительно упрощает начало работы, предлагая среду IDE, изначально понимающую Docker.

          Вы можете подготовить образ Docker, который предоставит разработчикам все необходимое для работы в вашей системе: язык программирования, зависимости и удобные инструменты. Разработчики запускали контейнер, подключались к нему из VS Code и продолжали свою работу, не устанавливая ничего (кроме Code) на свою машину. Если зависимость должна быть исправлена, вам нужно всего лишь обновить общий образ Docker и попросить разработчиков добавить новый тег.

          • › Как разрабатывать на удаленном SSH-сервере с помощью кода Visual Studio
          • › Как использовать Docker для упаковки приложений CLI
          • › CloudFoundry или Kubernetes: какую облачную платформу выбрать?
          • › Как развернуть сервер GitLab с помощью Docker
          • › Что нового в TypeScript 4.6?
          • › Что будет в React 18?
          • › Как развернуть веб-сервер Caddy с помощью Docker

          Читайте также: