docker-compose:Dockerfile参数以及说明
创始人
2025-05-28 09:35:39
0

文章目录

  • 一、Dockerfile
    • FROM
    • RUN
    • CMD
    • ENTRYPOINT
    • LABLE
    • EXPOSE
    • ADD
    • COPY
    • VOLUME
    • USER
    • WORKDIR
    • ENV
    • ARG
    • 示例
  • 二、docker-compose编排
    • images
    • container_name
    • build
    • command
    • depends_on
    • entrypoint
    • env_file
    • environment
    • external_links
    • labels
    • links
    • ports
    • network_mode
    • networks
    • restart
    • volumes
    • volumes_from
    • working_dir
    • 示例


一、Dockerfile

FROM

选择基础镜像,docker当前要生成的镜像以哪个镜像为基础。

FROM java

RUN

容器 构建时 需要运行的命令(区别于后面的CMD)

有两种格式:

  • shell命令格式
RUN commond
构如:建时,打印hello world
RUN echo "Hello World !"   
  • exec 格式
RUN ["executable", "param1", "param2"]
RUN ["echo","Hello world !"] 

CMD

容器启动之后要运行的命令

注意 CMD一个文件中只能有一条指令Dockerfile。如果您列出多个,CMD 则只有最后一个会生效。

三种格式:

  • shell命令格式
CMD echo "Hello World !"   
  • exec格式
CMD ["executable", "param1", "param2"]
CMD ["echo","Hello world !"] 
  • 作为 ENTRYPOINT 的参数使用

若 变量 ENTRYPOINT 存在,CMD将作为参数进行传递,而不是执行。

ENTRYPOINT

容器启动之后要运行的命令,同上述CMD ,同样若有多个参数,只有最后一个参数生效。

也是两种形式:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

1、docker至少指定一个CMD 或者 ENTRYPOINT命令

2、CMD 在运行时会被参数覆盖

不同格式下CMDENTRYPOINT的关系:

没有ENTRYPOINTENTRYPOINT nginx -cENTRYPOINT [“nginx”,“-c”]
没有CMD报错,至少存在一个/bin/bash -c nginx -cnginx -c
CMD [“nginx.conf”]nginx.conf/bin/bash -c nginx -c nginx.confnginx -c nginx.conf
CMD nginx.conf/bin/bash -c nginx.conf/bin/bash -c nginx -c nginx.confnginx -c /bin/bash -c nginx.conf

所以若指定nginx配置文件应该使用 ENTRYPOINT ["nginx","-c"]CMD ["nginx.conf"],并且CMD命令可被替换,所以通常用这种格式。

LABLE

标签 键值对的形式

LABEL = = = ...如 打上作者标签
LABLE author = '杀生丸'
若要引用变量请使用双引号,单引号会直接解析成字符串输出
LABLE author = "xxx-${author}"

LABLE替换了 MAINTAINER 的使用

MAINTAINER 

EXPOSE

对外暴露的端口

EXPOSE  [/...]

ADD

将主机的文件复制到镜像中,如仅限本地的 tar 提取和远程 URL 支持

ADD [--chown=:] [--checksum=] ... 
ADD [--chown=:] ["",... ""]将home开头的所有文件复制到mydir文件夹下
ADD hom* /mydir/

COPY

ADD,复制文件,只能从主机复制文件到镜像中。

COPY [--chown=:] [--checksum=] ... 
COPY [--chown=:] ["",... ""]将home开头的所有文件复制到mydir文件夹下
COPY hom* /mydir/

VOLUME

容器卷,也就是挂在数据,用于数据保存和持久化工作

VOLUME ["/data"]

USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

WORKDIR

工作目录,进入容器后的落脚点,如果不指定则是 /.

WORKDIR /xxx/

ENV

环境变量、键值对的形式,运行时ENV 依然有效。

ENV = ...ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy

ARG

使用ARGENV指令来指定指令可用的变量RUN。若变量同名,ENV有更高优先级。运行时ARG无效。

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER

示例

FROM alpine
WORKDIR /app
COPY src/ /app  #相似命令ADD,ADD自带解压
RUN echo >> 1.txt
CMD tail -f 1.txt #ENTRYPOINT俩如果未指定都是继承自父镜像,如果祖辈也都没指定CMD或ENTRYPOINT,则镜像无法构建

最后构建镜像

docker build -t test .
-t tag 镜像名称 . 当前目录

运行镜像,生成新的容器。

docker run test

二、docker-compose编排

images

指定镜像

# 描述 Compose 文件的版本信息
version: "3.9"# 定义服务,可以多个
services:redis-6382: # 服务名称image: redis:7.0 # 创建容器时所需的镜像

container_name

默认事故services下标签作为容器名,也可自己指定。

container_name: app

build

指定dockerfile 进行构建,在dockerfile文件中设置的参数无需再docker-compose.yml中再次设置。

可以直接指定目录,默认读取Dockerfile文件,也可以如下所示指定文件

 build: /path/to/build/dirbuild:context: ./dirdockerfile: Dockerfile-alternate

command

容器启动后的命令,如指定redis的配置文件

command: redis-server /etc/redis/redis.conf

depends_on

表示指定镜像之间的依赖关系,以及启动顺序。理解成sping的依赖即可。

如下,web依赖了db以及redis,所以会先加载redis和db容器,最后加载web容器。

services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres

entrypoint

Dockerfile中的作用。

env_file

指定文件,可将文件内容作为环境变量添加到容器中,但是在容器构建期间环境变量无效。

env_file:- ./a.env- ./b.env

environment

设置环境变量,可以将变量保存到容器中。

environment:RACK_ENV: developmentSHOW: "true"USER_INPUT:

external_links

在使用Docker过程中,我们会有许多单独使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。

external_links:- redis_1- project_db_1:mysql- project_db_1:postgresql

labels

容器中打上标签,同Dockerfile的lable作用

labels:com.example.description: "Accounting webapp"com.example.department: "Finance"com.example.label-with-empty-value: ""

links

定义在不同容器的网络链接。 链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”

web:links:- db- db:database- redis

ports

宿主机与容器映射的端口。 [HOST:]CONTAINER[/PROTOCOL]

ports:- "3000"- "8000:8000"

network_mode

网络模式

network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"

networks

定义容器附加的网络,默认是bridge模式

services:some-service:networks:- some-network- other-network

也可指定别名使用子标签 aliases ,相同的服务可以在不同的网络有不同的别名。

services:some-service:networks:some-network:aliases:- alias1- alias3other-network:aliases:- alias2

restart

重启策略

	restart: "no"restart: alwaysrestart: on-failurerestart: unless-stopped

volumes

挂载一个目录或者一个已存在的数据卷容器

services:redis-6382: # 服务名称volumes: # 数据卷,目录挂载- /var/lib/mysql # 只指定一个目录,在容器内部创建容器卷- /usr/local/redis_cluster/master01/conf:/etc/redis- /usr/local/redis_cluster/master01/data:/data

volumes_from

从其他容器或服务挂载数据卷。

volumes_from:- service_name- service_name:ro- container:container_name- container:container_name:rw

working_dir

工作目录

示例

安装mysql以及redis集群

具体说明参考:

redis集群搭建过程

Mysql集群搭建过程

# 描述 Compose 文件的版本信息
version: "3.9"# 定义服务,可以多个
services:mysql_master: # 服务名称image: mysql # 创建容器时所需的镜像container_name: mysql_master # 容器名称restart: always # 容器总是重新启动privileged: truevolumes: # 数据卷,目录挂载- /usr/local/mysql_cluster/master/data:/var/lib/mysql:rw- /usr/local/mysql_cluster/master/conf/my.cnf:/etc/mysql/my.cnfenvironment:- MYSQL_ROOT_PASSWORD=******mysql_slave: # 服务名称image: mysql # 创建容器时所需的镜像container_name: mysql_slave # 容器名称restart: always # 容器总是重新启动privileged: truevolumes: # 数据卷,目录挂载- /usr/local/mysql_cluster/slave/data:/var/lib/mysql:rw- /usr/local/mysql_cluster/slave/conf/my.cnf:/etc/mysql/my.cnfenvironment:- MYSQL_ROOT_PASSWORD=******redis-6382: # 服务名称image: redis:7.0 # 创建容器时所需的镜像container_name: redis-6382 # 容器名称restart: always # 容器总是重新启动network_mode: "host" # host 网络模式volumes: # 数据卷,目录挂载- /usr/local/redis_cluster/master01/conf:/etc/redis- /usr/local/redis_cluster/master01/data:/datacommand: redis-server /etc/redis/redis.conf # 覆盖容器启动后默认执行的命令redis-6383:image: redis:7.0 # 创建容器时所需的镜像container_name: redis-6383network_mode: "host"volumes:- /usr/local/redis_cluster/master02/conf:/etc/redis- /usr/local/redis_cluster/master02/data:/datacommand: redis-server /etc/redis/redis.confredis-6384:image: redis:7.0 # 创建容器时所需的镜像container_name: redis-6384network_mode: "host"volumes:- /usr/local/redis_cluster/master03/conf:/etc/redis- /usr/local/redis_cluster/master03/data:/datacommand: redis-server /etc/redis/redis.confredis-6385: # 服务名称image: redis:7.0 # 创建容器时所需的镜像container_name: redis-6385 # 容器名称restart: always # 容器总是重新启动network_mode: "host" # host 网络模式volumes: # 数据卷,目录挂载- /usr/local/redis_cluster/slave01/conf:/etc/redis- /usr/local/redis_cluster/slave01/data:/datacommand: redis-server /etc/redis/redis.confredis-6386:image: redis:7.0 # 创建容器时所需的镜像container_name: redis-6386network_mode: "host"volumes:- /usr/local/redis_cluster/slave02/conf:/etc/redis- /usr/local/redis_cluster/slave02/data:/datacommand: redis-server /etc/redis/redis.confredis-6387:image: redis:7.0 # 创建容器时所需的镜像container_name: redis-6387network_mode: "host"volumes:- /usr/local/redis_cluster/slave03/conf:/etc/redis- /usr/local/redis_cluster/slave03/data:/datacommand: redis-server /etc/redis/redis.conf

相关内容

热门资讯

深圳百亿地块命运反转,华发股份... 房地产市场深度调整之际,深圳再度出手托底。 7月28日,华发股份公告称,全资子公司深圳融华置地投资有...
IPO严监管下,年内74家企业... 今年以来,IPO市场风起云涌,据统计,已有74家企业选择撤回或终止其上市申请。这一动态背后,监管层对...
文峰股份:股东郑素贞所持全部公... 文峰股份公告,近日,公司收到青岛中院《拍卖通知书(变卖)》,公司持股5%以上股东郑素贞持有的公司12...
美亚科技IPO进行时:票务业务... 广东美亚旅游科技集团股份有限公司(美亚科技)近日向北交所提交了第三轮问询回复,继续推进其IPO进程。...
权威发布丨25条新政出台!我市... 7月29日,烟台市人民政府新闻办公室举行新闻发布会。烟台市住房和城乡建设局党组书记、局长孙玉荣介绍加...
AI成民营银行下一个十年的 关... [ 2024年民营银行整体业绩承压明显。19家银行合计净利润187.76亿元,同比下滑8.14%。 ...
丰林集团股价微跌0.87% 子... 丰林集团股价报2.29元,较前一交易日下跌0.02元,跌幅0.87%。盘中波动区间为2.25元至2....
长安汽车:中国长安汽车集团合计... 长安汽车 视觉中国 资料图 中国长安汽车集团有限公司(下称“中国长安汽车集团”)成立后,A股上市公司...
机构席位卖出456.92万 北... 每经讯,2025年7月29日,北交所上市公司天润科技(430564,收盘价:27.16元)登上龙虎榜...
小麦集中收购即将过半 政策收储... 夏粮小麦集中收购期即将过半,小麦市场供需博弈依旧僵持。当前,政策稳价、稳市意愿仍然较强,但面粉消费需...
珠江啤酒高层变动,“华南王”何... 升任董事长一个月后,黄文胜辞去了珠江啤酒总经理一职。 近日,珠江啤酒披露公告,称因工作调整,黄文胜申...
苹果在美开“制造学院”,AI、... IT之家 7 月 29 日消息,苹果公司宣布,将在底特律开设全新的苹果制造学院(Apple Manu...
首家民营银行半年报,民商银行净... 近日,温州民商银行股份有限公司(下称民商银行)发布了2025年半年度报告,这也是首家发布半年业绩的民...
美股盘前暴跌28%!诺和诺德任... 29日周二,丹麦制药巨头诺和诺德在减肥药销售放缓导致利润预警后,提拔国际业务负责人Maziar Mi...
【广发•早间速递】聚焦再平衡,... 来源:广发证券研究 注:音频如有歧义以研究报告内容为准 研究精选 宏观:6月中游制造行业利润分化 ...
理想汽车,突然直线大跌!中概新... 今晚(7月29日),美股高开后有所回落,截至发稿,道指飘绿,纳指与标普500指数飘红。 个股方面,美...
宝安科创“兽”群图鉴更新!一医... 宝安制造业沃土再添科创标杆!近日,在深圳市工业和信息化局、深圳市中小企业服务局指导举办的2025中国...
轩竹生物:研发人数锐减,融资近... 轩竹生物科技股份有限公司(简称“轩竹生物”),这家专注于消化、肿瘤及非酒精性脂肪肝炎等重大疾病领域的...
爱柯迪涨5.52%,西南证券二... 今日爱柯迪(600933)涨5.52%,收盘报17.0元。 2025年5月2日,西南证券研究员郑连声...
中原高速连跌5天,南方基金旗下... 7月29日,中原高速连续5个交易日下跌,区间累计跌幅-6.76%。河南中原高速公路股份有限公司是经河...