Чем содержимое в "XDG_CACHE_HOME = / cache" отличается от содержимого в "-d / build"? - PullRequest
0 голосов
/ 17 октября 2019

Ниже Dockerfile имеет переменную окружения XDG_CACHE_HOME=/cache

, которая позволяет команде

  pip install -r requirements_test.txt

использовать локальный кеш (как показано ниже) вместо загрузки из сети:

enter image description here


Но ниже Dockerfile также имеется папка /build.

Итак, я хотел бы понять,

, если цель (содержимое) папки /build отличается от папки /cache

Dockerfile

FROM useraccount/todobackend-base:latest

MAINTAINER Development team <devteam@abc.com>

RUN apt-get update && \
    # Development image should have access to source code and
    # be able to compile python package dependencies that installs from source distribution
    # python-dev has core development libraries required to build & compile python application from source
    apt-get install -qy python-dev libmysqlclient-dev

# Activate virtual environment and install wheel support
# Python wheels are application package artifacts
RUN . /appenv/bin/activate && \
    pip install wheel --upgrade

# PIP environment variables (NOTE: must be set after installing wheel)
# Configure docker image to output wheels to folder called /wheelhouse
# PIP cache location using XDG_CACHE_HOME to improve performance during test/build/release operation
ENV WHEELHOUSE=/wheelhouse PIP_WHEEL_DIR=/wheelhouse PIP_FIND_LINKS=/wheelhouse XDG_CACHE_HOME=/cache 

# OUTPUT: Build artifacts (wheels) are output here
# Read more - https://www.projectatomic.io/docs/docker-image-author-guidance/ 
VOLUME /wheelhouse

# OUTPUT: Build cache
VOLUME /build

# OUTPUT: Test reports are output here
VOLUME /reports

# Add test entrypoint script
COPY scripts/test.sh /usr/local/bin/test.sh
RUN chmod +x /usr/local/bin/test.sh

# Set defaults for entrypoint and command string
ENTRYPOINT ["test.sh"]
CMD ["python", "manage.py", "test", "--noinput"]

# Add application source
COPY src /application
WORKDIR /application

Ниже находится файл docker-compose.yml

test:  # Unit & integration testing
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes_from:
    - cache
  links:
    - db
  environment:
    DJANGO_SETTINGS_MODULE: todobackend.settings.test
    MYSQL_HOST: db
    MYSQL_USER: root
    MYSQL_PASSWORD: password
    TEST_OUTPUT_DIR: /reports

builder: # Generate python artifacts
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - ../../target:/wheelhouse
  volumes_from:
    - cache
  entrypoint: "entrypoint.sh"
  command: ["pip", "wheel", "--non-index", "-f /build", "."]

db:
  image: mysql:5.6
  hostname: db
  expose:
    - "3386"
  environment:
    MYSQL_ROOT_PASSWORD: password

cache:  # volume container 
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - /tmp/cache:/cache
    - /build
  entrypoint: "true"

Ниже тома

  volumes:
    - /tmp/cache:/cache
    - /build

создаются в контейнере томов (cache)


файл точки входа test.sh:

#!/bin/bash
# Activate virtual environment
. /appenv/bin/activate

# Download requirements to build cache
pip download -d /build -r requirements_test.txt --no-input

# Install application test requirements
# -r allows the requirements to be mentioned in a txt file
# pip install -r requirements_test.txt
pip install --no-index -f /build -r requirements_test.txt

# Run test.sh arguments
exec $@

Редактировать:

pip download -d /build -r requirements_test.txt --no-input хранение файлов в папке /build

enter image description here

pip install -r requirements_test.txt выбирает зависимости из папки /build:

enter image description here

Выше двух команд не используется папка /cache


1)

Итак,

Зачем нам нужна папка /cache? Команда pip install относится к /build

2)

В test.sh файле .... С точки зрения использования /build против /cache содержимого ...

Чем

pip install --no-index -f /build -r requirements_test.txt

отличается от

pip install -r requirements_test.txt команды?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Python имеет несколько различных форматов для пакетов. Обычно они распространяются в виде исходного кода, который может запускаться везде, где работает Python, но иногда имеют расширения C (или FORTRAN!), Для сборки которых требуется внешний компилятор. Текущий рекомендуемый формат - wheel , который может быть специфичен для конкретной ОС и определенных параметров сборки Python, но не зависит ни от чего на уровне ОС вне Python. Руководство пользователя по упаковке Python содержит более подробные сведения об этом.

Том build содержит .whl файлов для вашего приложения;том wheelhouse содержит файлы .whl для других пакетов Python;том cache содержит файлы .tar.gz или .whl, которые загружаются из PyPI. Том cache используется только при загрузке;тома build и wheelhouse используются для установки кода без необходимости загрузки вообще.

Опция pip --no-index говорит: "не связываться с публичным PyPI";-f /build говорит "использовать артефакты, расположенные здесь". Переменные окружения, упоминающие /wheelhouse, также имеют эффект. Они позволяют вам устанавливать пакеты, используя только то, что вы уже собрали.


Настройка Docker Compose - это довольно долгий способ построить ваше приложение в виде колес, а затем сделать его доступным дляобраз времени выполнения, в котором нет цепочки инструментов.

Контейнер cache буквально ничего не делает. Он имеет две директории, которые вы показываете: /cache - это каталог, смонтированный на хосте, а /build - анонимный том. Другие контейнеры имеют volumes_from: cache для повторного использования этих томов. (По стилю добавление именованного volumes: к docker-compose.yml почти определенно лучше.)

Контейнер builder работает только pip wheel. Он устанавливает дополнительный каталог, ./target с точки зрения Dockerfile, на /wheelhouse. В документации pip install обсуждается, как работает кэширование: если он загружает файлы, они попадают в $XDG_CACHE_DIR (каталог томов /cache), а если он создает колеса, они переходят в каталог томов /wheelhouse. Вывод pip wheel попадет в каталог тома /build.

Контейнер test во время запуска загружает некоторые дополнительные пакеты и помещает их в том build. Затем он pip install --no-index устанавливает пакеты только с использованием томов build и wheelhouse, вообще не обращаясь к PyPI.


Эта установка довольно сложна для того, что она делает. Некоторые общие рекомендации, которые я бы предложил здесь:

  • Предпочитайте именованные тома контейнерам томов данных. (У очень ранних версий Docker не было именованных томов, но все, что работает в современном дистрибутиве Linux, будет.)
  • Не устанавливайте виртуальную среду внутри вашего образа;просто установите непосредственно в системное дерево Python.
  • Установите программное обеспечение во время создания образа (в Dockerfile), а не во время запуска образа (в сценарии точки входа).
  • Не объявлять VOLUME в Dockerfile почти всегда;это не нужно для этой настройки, и когда она имеет эффекты, она обычно более запутанная, чем полезная.

Более типичная установка будет заключаться в том, чтобы собрать все это за один выстрел в этап сборки . Единственным недостатком этого является то, что загрузки не кэшируются между сборками: если ваш список требований не меняется, то Docker будет использовать его как набор, но если вы добавите или удалите какую-либо одну вещь, Docker повторит pipКоманда для загрузки всего набора.

Это будет выглядеть примерно (не проверено):

# First stage: build and download wheels
FROM python:3 AS build

# Bootstrap some Python dependencies.
RUN pip install --upgrade pip \
 && pip install wheel

# This stage can need some extra host dependencies, like
# compilers and C libraries.
RUN apt-get update && \
    apt-get install -qy python-dev libmysqlclient-dev

# Create a directory to hold built wheels.
RUN mkdir /wheel

# Install the application's dependencies (only).
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --wheel-dir=/wheel -r requirements.txt \
 && pip install --no-index --find-links=/wheel -r requirements.txt

# Build a wheel out of the application.
COPY . .
RUN pip wheel --wheel-dir=/wheel --no-index --find-links=/wheel .

# Second stage: actually run the application.
FROM python:3

# Bootstrap some Python dependencies.
RUN pip install --upgrade pip \
 && pip install wheel

# Get the wheels from the first stage.
RUN mkdir /wheel
COPY --from=build /wheel /wheel

# Install them.
RUN pip install --no-index --find-links=/wheel /wheel/*.whl

# Standard application metadata.
# The application should be declared as entry_points in setup.py.
EXPOSE 3000
CMD ["the_application"]
1 голос
/ 17 октября 2019

1) Они могут быть одинаковыми, но не так хорошо. Как я понимаю, что здесь делается, так это то, что /cache использует ваш хост кеш (/tmp/cache находится в хосте), а затем контейнер создает кеш (используя кэш хоста) и сохраняет его в/build, что указывает на /var/lib/docker/volumes/hjfhjksahfjksa на вашем хосте.

Таким образом, они могут быть одинаковыми в некоторый момент, но не всегда.

2) Этот контейнер нуждается в кеше, хранящемся в /build, поэтому вам нужно использовать флаг -f, чтобы сообщить пункту, где он находится.

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