docker - 为什么 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 不需要它吗?
解决方案
推荐阅读
- json - 将 JSON 数据从 DocumentDB(或 CosmosDB)移动到 Azure Data Lake
- git - 阻止所有分支的 git force push
- ios - 在整个应用程序的 iOS 应用程序中删除后退按钮的标题或文本
- webpack - webpack 的 devServer 的默认根目录是什么?
- ios - 如何更改绘制线的粗细?
- selenium - 如何在 Selenium Chrome 容器中设置代理?
- angular - http 状态代码错误 400:带有 ngx-soap 的 Angular 4 中的 SOAP 客户端
- sql - 访问交叉表查询
- ios - 具有未来日期的 UNCalendarNotificationTrigger
- sql - 每次都写一个额外的列来查询具有不同值的结果