Тома Docker не монтируются / не связываются - PullRequest
0 голосов
/ 08 ноября 2019

Я в Docker Desktop для Windows. Я пытаюсь использовать docker-compose в качестве контейнера сборки, где он собирает мой код, а затем код находится в моей локальной папке сборки. Процессы сборки определенно успешны;когда я exec в свой контейнер, файлы там. Однако с моей локальной папкой ничего не происходит - папка build не создается.

docker-compose.yml

version: '3'
services:
  front_end_build:
    image: webapp-build
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 5000:5000
    volumes:
      - "./build:/srv/build"

Dockerfile

FROM node:8.10.0-alpine

EXPOSE 5000

# add files from local to container
ADD . /srv

# navigate to the directory
WORKDIR /srv

# install dependencies
RUN npm install --pure-lockfile --silent

# build code (to-do: get this code somewhere where we can use it)
RUN npm run build

# install 'serve' and launch server.
# note: this is just to keep container running
# (so we can exec into it and check for the files).
# once we know that everything is working, we should delete this.
RUN npx serve -s -l tcp://0.0.0.0:5000 build

Я такжепопытался удалить последнюю строку, которая обслуживает папку. Затем я действительно получил папку для сборки, но эта папка была пуста.

ОБНОВЛЕНИЕ: Я также пробовал многоэтапную сборку:

FROM node:12.13.0-alpine AS builder
WORKDIR /app
COPY . .
RUN yarn
RUN yarn run build

FROM node:12.13.0-alpine
RUN yarn global add serve
WORKDIR /app
COPY --from=builder /app/build .
CMD ["serve", "-p", "80", "-s", "."]

Когда мои тома не установлены(или настроены, скажем, на какой-нибудь несуществующий исходный каталог, например ./build:/nonexistent), приложение обслуживается правильно, и я получаю пустую папку сборки на локальном компьютере (пустую, поскольку исходная папка не существует).

Однако, когда я установил volumes на - "./build:/app" (правильный источник для встроенных файлов), я не только получаю пустую папку build на моем локальном компьютере, но и папку app в контейнере. тоже пусто!

Похоже, что происходит что-то вроде 1. Контейнер собран, который строит файлы в сборщике. 2. Файлы копируются из компоновщика во второй контейнер. 3. Тома связаны, а затем, поскольку моя локальная папка build пуста, связанная папка в контейнере также становится пустой!

Я попытался сбросить учетные данные общих дисков, но безрезультатно.

Как мне это сделать?!?!

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Я полагаю, вы неправильно понимаете, как работают тома хоста. Определение тома:

./build:/srv/build

В составном файле будет монтироваться ./build с хоста на /srv/build внутри контейнера. Это происходит во время выполнения, а не во время сборки образа, поэтому после выполнения инструкций Dockerfile. Ничто из образа не копируется на хост, и никакие файлы в каталоге, монтируемом сверху, не будут видны (это стандартное поведение команды монтирования Linux).

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

  1. Вы можете выполнить свои действия, чтобы заполнить папку сборки как часть запуска контейнера. Это общее для развития. Для этого ваш CMD, скорее всего, станет сценарием для запуска нескольких команд, а последним шагом будет exec для запуска вашего приложения.

  2. Вы можете переключиться на именованныйобъем. Docker инициализирует их содержимым изображения. Можно даже создать именованное подключение к папке на вашем хосте, которое почти совпадает с подключением хоста. В моей презентации есть пример именованного монтирования bind .

  3. Ваша точка входа в контейнер может при запуске скопировать файлы в хост-монтирование. Это обычно видно на изображениях, которые будут запускаться в неизвестных ситуациях, например, изображение Дженкинса. Я также делаю это в своих сценариях сохранения / загрузки томов в моем примере базовое изображение .

0 голосов
/ 09 ноября 2019

tl; dr; Тома не монтируются на этапе сборки, только во время работы контейнера. Вы можете запустить команду docker run <image id> -v ./build/:/srv/build cp -R /app /srv/build, чтобы скопировать данные на локальный диск


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

Результатом этого является то, что поток данных во время сборки является однонаправленным, вы не можете смонтировать том с хоста в контейнер. Когда вы запустите сборку, вы увидите Sending build context to Docker daemon, потому что ваш локальный интерфейс командной строки Docker отправляет context (путь, который вы указали после docker build, обычно ., который представляет текущий каталог) вДемон Docker (процесс, который фактически выполняет работу). Следует помнить один ключевой момент: интерфейс командной строки Docker (docker) фактически не выполняет никакой работы, он просто отправляет команды демону Docker dockerd. Этапы сборки не должны ничего менять в вашей локальной системе, контейнер предназначен для инкапсуляции изменений только в образ контейнера и дает вам снимок сборки, которую вы можете последовательно использовать, зная, чтосодержимое одинаковое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...