首页 > 解决方案 > 为什么 docker compose 比使用 Dockerfile 快得多?

问题描述

当我运行时docker build .,它会在执行任何其他操作之前将整个目录(减去 .dockerignore,我想)发送到 docker 上下文:

Sending build context to Docker daemon  411.9MB

但是,如果我创建一个执行相同步骤的 docker-compose 文件,它似乎不会向 docker 上下文发送任何内容。两者有什么区别,如果 docker-compose 总是这么快,我为什么要使用普通的 dockerfile?

dockerfile 示例:

# Step 1: compile front end
# use NPM image
FROM node:10-alpine as webui
WORKDIR /webui

# NPM dependencies
COPY ./webui/package.json ./webui/yarn.lock ./
RUN yarn install

# Copy web ui code
COPY ./webui .

# Build -> outputs to ./public
ARG GIT_HASH=GIT_HASH
ARG LAST_UPDATED=LAST_UPDATED
ARG API_HOST=API_HOST
RUN yarn run build:production

# Step 2: Compile Server
# Use NPM Image
FROM node:10-alpine
WORKDIR /server

# Npm dependencies
COPY ./server/package.json ./server/yarn.lock ./
RUN yarn install

# Copy server code and compile
COPY ./server .
RUN yarn run build:production

# Include the webui compiled above
COPY --from=webui /public/ /public

# Run server
EXPOSE 8080
CMD node /server/dist/index.js

示例 docker 撰写:

version: "3.5"

volumes:
  server_node_modules:
  webui_node_modules:

  server-base: &server-base
    image: node:10-alpine
    working_dir: /server
    volumes:
      - ./server:/server
      - ./public:/public
      - server_node_modules:/server/node_modules

  server-install:
    <<: *server-base
    command: "yarn install"

  server-serve:
    <<: *server-base
    ports:
      - 8080:8080
    command: "yarn run local"

  webui-base: &webui-base
    image: node:10-alpine
    working_dir: /webui
    volumes:
      - ./webui:/webui
      - ./public:/webui/dist
      - webui_node_modules:/webui/node_modules

  webui-install:
    <<: *webui-base
    command: "yarn install"

  webui-build:
    <<: *webui-base
    command: "yarn run build:local"

  webui-prod:
    <<: *webui-base
    command: "yarn run build:production"

  webui-dev:
    <<: *webui-base
    command: "yarn run dev:watch"

在这种情况下,我会跑来docker-compose up -d server-serve webui-prod完成与 dockerfile 相同的事情(或多或少)。那么上下文是什么,docker compose 不需要它吗?

标签: dockerdocker-compose

解决方案


推荐阅读