代码之家  ›  专栏  ›  技术社区  ›  nicolas

多阶段内置docker compose?

  •  3
  • nicolas  · 技术社区  · 7 年前

    如何在一个 docker-compose.yml ?

    对于每个变体(例如dev、prod…),我有一个包含2个docker文件的多阶段构建:

    • 开发人员: Dockerfile.base Dockerfile.dev
    • 或产品: Dockerfile.base文件 + Dockerfile.prod

    Dockerfile.base文件 (所有变体通用):

    FROM python:3.6
    RUN apt-get update && apt-get upgrade -y
    RUN pip install pipenv pip
    COPY Pipfile ./
    # some more common configuration...
    

    Dockerfile.dev文件

    FROM flaskapp:base
    RUN pipenv install --system --skip-lock --dev
    ENV FLASK_ENV development
    ENV FLASK_DEBUG 1
    

    文件 :

    FROM flaskapp:base
    RUN pipenv install --system --skip-lock
    ENV FLASK_ENV production
    

    # Building dev
    docker build --tag flaskapp:base -f Dockerfile.base .
    docker build --tag flaskapp:dev -f Dockerfile.dev .
    # or building prod
    docker build --tag flaskapp:base -f Dockerfile.base .
    docker build --tag flaskapp:dev -f Dockerfile.dev .
    

    根据 compose-file doc

    # docker-compose.yml
    version: '3'
    services:
      webapp:
        build:
          context: ./dir
          dockerfile: Dockerfile-alternate
    

    但如何在中指定2个Dockerfiles docker-compose.yml公司

    1 回复  |  直到 7 年前
        1
  •  76
  •   BMitch    7 年前

    您可以使用以下语法将这些转换为非传统的多阶段构建(我说非传统是因为您不在层之间执行任何复制,而是只使用from行从前一阶段拾取):

    FROM python:3.6 as base
    RUN apt-get update && apt-get upgrade -y
    RUN pip install pipenv pip
    COPY Pipfile ./
    # some more common configuration...
    
    FROM base as dev
    RUN pipenv install --system --skip-lock --dev
    ENV FLASK_ENV development
    ENV FLASK_DEBUG 1
    
    FROM base as prod
    RUN pipenv install --system --skip-lock
    ENV FLASK_ENV production
    

    然后可以使用 --target 要生成的语法或编写文件,如:

    # docker-compose.yml
    version: '3.4'
    services:
      webapp:
        build:
          context: ./dir
          dockerfile: Dockerfile
          target: prod
    

    尽管如此,我相信这是想把一个正方形的销钉塞进一个圆孔里。docker compose开发人员鼓励用户不要在compose文件本身中进行构建,因为swarm模式不支持它。相反,建议的解决方案是使用CI/CD构建服务器执行构建,并将这些映像推送到注册表。然后您可以运行相同的compose文件 docker-compose docker stack deploy 甚至一些k8s的等价物,而不需要重新设计您的工作流程。

        2
  •  0
  •   AgBorkowski    6 年前

    dockerfile docker-compose -f docker-compose.yml -f docker-compose.prod.yml build