В разных контекстах, таких как разработка, проведение тестов или обслуживающих продуктов, наши приложения имеют разные потребности, когда речь идет до их докера. Для разработки вы можете потребоваться сервер Live-Reled со всеми необходимыми зависимостями. Для тестирования вам, вероятно, нужны еще несколько пакетов, которые вы Определенно Не хочу на производство.
Есть способы поступить в это, первый, который имеет в виду, использует несколько докерфайлов, и просто рассказывает докер, который использовать. Но этот подход имеет свои пределы, особенно вдоль дороги, где каждый файл может очень легко развивать свою жизнь, расходящийся друг от друга, помимознания.
К счастью, поскольку Docker 17.05 у нас есть концепция Многоступенчатые сборки Отказ Способность объявлять отдельные изображения в одном Dockerfile
и свободно наследовать или копировать данные между собой. Это точный подход, который я использовал при строительстве изображений для Lox :
############################################# # Base container with all necessary deps FROM tiangolo/uvicorn-gunicorn:python3.7-alpine3.8 AS base ENV HOME=/app BUILD_DEPS="build-base linux-headers postgresql postgresql-dev libffi-dev" WORKDIR ${HOME} # Copy the pipenv files COPY Pipfile ${WORKDIR}/ COPY Pipfile.lock ${WORKDIR}/ # 1. Install system dependencies # 2. Install pipenv # 3. Use pipenv to install app deps # 4. Remove system deps to save space RUN apk add --no-cache ${BUILD_DEPS} \ && pip install --no-cache-dir pipenv \ && pipenv install --system \ && apk del ${BUILD_DEPS} ############################################# # Test container from a common base FROM base AS test # Same as in the base image but this time we also install the --dev packages RUN apk add --no-cache ${BUILD_DEPS} \ && pip install --no-cache-dir pipenv \ && pipenv install --system --dev \ && apk del ${BUILD_DEPS} ############################################# # Live container with Webpack watcher FROM base AS live # Install Node.js dependencies RUN apk add --no-cache nodejs npm # Install all Webpack dependencies COPY package.json package-lock.json ./ RUN npm install # Finally copy the current sources and build the bundle COPY . . RUN npm run bundle:build ############################################# # Final container with the app FROM base AS production # Only copy the ready app dir from the live step COPY --from=live ${WORKDIR} ${WORKDIR}
Примечание: Ради краткости, это Dockerfile
Не содержит всех улучшений размера и произведет немного большие изображения.
Теперь вы можете строить отдельные изображения для каждого из ваших потребностей:
Тестирование
$ docker build -t suda/lox/test --target test .
Разработка W/Live-Reled
$ docker build -t suda/lox/live --target live .
Производство
$ docker build -t suda/lox --target production .
P.S.: Возможно, вы заметили, что использовал отличный базовый образ Python из Себастьян Рамирес И если вы хотите развернуть проект Django с помощью ASGI , У меня есть некоторые инструкции, которые могут помочь вам Отказ
Оригинал: “https://dev.to/suda/single-dockerfile-for-testing-and-production-using-multi-stage-builds-189o”