Как скопировать локальную файловую систему в контейнер Docker - PullRequest
0 голосов
/ 16 мая 2019

У меня есть структура каталогов локального проекта, например:

config
    test
        docker-compose.yaml
        DockerFile
        pip-requirements.txt
src
    app
        app.py

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

Мой docker-compose.yaml выглядит так:

version: '3'
services:
    worker:
        image: myname:mytag
        build:
            context: .
            dockerfile: ./Dockerfile
        volumes:
            -  ./src/app:/usr/local/myproject/src/app

Мой Dockerfile выглядит так:

FROM python:2.7

# Set the working directory.
WORKDIR /usr/local/myproject/src/app

# Copy the current directory contents into the container.
COPY src/app /usr/local/myproject/src/app
COPY pip-requirements.txt pip-requirements.txt

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r pip-requirements.txt

# Define environment variable
ENV PYTHONUNBUFFERED 1

CMD ["./app.py"]

Если я запускаю из каталога верхнего уровня моего проекта:

docker-compose -f config/test/docker-compose.yaml up

удается создать образ, но не удается при попытке запустить образ с ошибкой:

ERROR: for worker  Cannot start service worker: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"./app.py\": stat ./app.py: no such file or directory": unknown

Если я проверяю файловую систему образа с помощью:

docker run --rm -it --entrypoint=/bin/bash myname:mytag

это правильно сбрасывает меня в /usr/local/myproject/src/app. Однако этот каталог пуст, что объясняет ошибку времени выполнения. Почему это пусто? Разве оператор COPY и volumes не заполнили изображение кодом моего приложения?

1 Ответ

1 голос
/ 16 мая 2019

Например, вы сокращаете набор данных, включая содержимое на этапе сборки, а затем используете docker-compose для наложения каталога поверх него.Давайте сначала обсудим различия между Dockerfile (Image) и Docker-compose (Runtime)

Обычно вы используете директиву COPY в dockerfile, чтобы скопировать компонент вашего локального каталога в образ, такчто он неизменен .В большинстве развертываний приложений это означает, что мы упаковываем все наше приложение в каталог и готовим его к работе.Это означает, что он не является динамическим (имеется в виду изменения, которые вы вносите в код после того, как они не видны в контейнере), но является преимуществом с точки зрения безопасности.

Docker-compose - это спецификация runtime , означающая: «Получив изображение, я хочу программно определить, как оно работает».Определяя здесь объем, вы говорите: «Я хочу, чтобы локальный каталог (с точки зрения файла компоновки) /src/app был наложен на /usr/local/myproject/src/app

Таким образом, все, что вы встроили в образ, не 'Это не имеет значения. Вы добавляете еще один слой поверх изображения, который будет иметь приоритет над тем, что было встроено в изображение.

Это может также быть связано с тем, что вы уже указали Workdir, а затем указали./ ссылка в CMD. Стоит попробовать это как просто CMD ["app.py"]

Что произойдет, если вы

  1. Создайте образ: docker build -t "test" .
  2. Выполнитеизображение вручную: "docker run --rm -it test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...