Dockerfile best practices
建议使用最小化的image.
RUN
有依赖的指令, 最好使用&&写在一条指令中, 例如
RUN apt-get update && apt-get install -y package-bar package-foo package-baz比较长的指令, 最好分行, 并排序
RUN apt-get update && apt-get install -y \aufs-tools \automake \btrfs-tools \build-essential \curl \dpkg-sig \git \iptables \libapparmor-dev \libcap-dev \libsqlite3-dev \lxc=1.0* \mercurial \parallel \reprepro \ruby1.9.1 \ruby1.9.1-dev \s3cmd=1.1.0*
ENV
可用于设置路径, 软件需要的特殊环境变量, 或者便于管理的环境变量等.
使用docker inspect可查.
For example, ENV PATH /usr/local/nginx/bin:$PATH will ensure that CMD [“nginx”] just works.
The ENV instruction is also useful for providing required environment variables specific to services you wish to containerize, such as Postgres’s PGDATA.
Lastly, ENV can also be used to set commonly used version numbers so that version bumps are easier to maintain, as seen in the following example:ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD & COPY
一般建议使用COPY, 如果要下载URL到image, 建议使用wget或curl ,然后解压.
For example, you should avoid doing things like:
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things allAnd instead, do something like:
RUN mdkir -p /usr/src/things \&& curl -SL http://example.com/big.tar.gz \| tar -xJC /usr/src/things \&& make -C /usr/src/things all不需要帮忙自动解压的地方, 建议使用COPY.
ENTRYPOINT
#!/bin/bash
set -eif [ "$1" = 'postgres' ]; thenchown -R postgres "$PGDATA"if [ -z "$(ls -A "$PGDATA")" ]; thengosu postgres initdbfiexec gosu postgres "$@"
fiexec "$@"
另一个例子 :
(for example, docker run -it mysql mysqld --some --flags will transparently run mysqld --some --flags after ENTRYPOINT runs initdb).
mysql的ENTRYPOINT脚本 :
#!/bin/bash
set -eif [ -z "$(ls -A /var/lib/mysql)" -a "${1%_safe}" = 'mysqld' ]; thenif [ -z "$MYSQL_ROOT_PASSWORD" ]; thenecho >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'exit 1fimysql_install_db --user=mysql --datadir=/var/lib/mysql# These statements _must_ be on individual lines, and _must_ end with# semicolons (no line breaks or comments are permitted).# TODO proper SQL escaping on ALL the things D:TEMP_FILE='/tmp/mysql-first-time.sql'cat > "$TEMP_FILE" <<-EOSQLDELETE FROM mysql.user ;CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;DROP DATABASE IF EXISTS test ;EOSQLif [ "$MYSQL_DATABASE" ]; thenecho "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE ;" >> "$TEMP_FILE"fiif [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; thenecho "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" >> "$TEMP_FILE"if [ "$MYSQL_DATABASE" ]; thenecho "GRANT ALL ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'%' ;" >> "$TEMP_FILE"fifiecho 'FLUSH PRIVILEGES ;' >> "$TEMP_FILE"set -- "$@" --init-file="$TEMP_FILE"
fichown -R mysql:mysql /var/lib/mysql
exec "$@"
使用例子 :
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
VOLUME
[参考]
Dockerfile best practices相关推荐
- (转) Dockerfile 中的 COPY 与 ADD 命令
原文:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基 ...
- (转) Dockerfile 中的 COPY 与 ADD 命令 1
原文:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基 ...
- Dockerfile最佳实践(二)
本文讲的是Dockerfile最佳实践(二),[编者的话]本文是 Docker 入门教程第三章-DockerFile 进阶篇的第二部分.作者主要介绍了 Docker 的变化.常用指令以及基础镜像的最佳 ...
- Dockerfile 参考文档中文版
一.概述 原文:https://docs.docker.com/engine/reference/builder/#dockerignore-file Docker 可以通过从 Dockerfile ...
- Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
2019独角兽企业重金招聘Python工程师标准>>> 通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一 ...
- 怎样去构建一个优质的Docker容器镜像
抛砖引玉 先说结论 以不变应万变 善用 cache, 使用一个相对固定的 build 环境 构建 自己的基础镜像 洁身自好 保持 context 干净: .dockerignore 镜像环境清理 你需 ...
- 如何使用Docker Compose安装Drupal
The author selected United Nations Foundation to receive a donation as part of the Write for DOnatio ...
- Dockerfile 最佳实践
之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以 ...
- Docker Review - dockerfile 入门篇
文章目录 Docker 镜像.容器 .Docker file 概述 Docker File文件格式 Docker File 解读 1.FROM 指定基础镜像 2.RUN 执行命令 3.COPY 复制文 ...
- dockerfile arg_Dockerfile最佳实践
帆仔 16年入职网易,先后负责过多个重要手游项目:关注自动化.容器.云等方向: 在容器领域,docker 公司提出的容器镜像已经成为目前容器打包交付的事实标准.构建镜像需要编写 Dockerfile, ...
最新文章
- 搞透Kafka的存储架构,看这篇就够了
- C语言经典算法 21-30
- 网络爬虫入门系列(3) httpClient
- zabbix v3.0安装部署【转】
- IO流 练习 -- 文件夹的删除
- ERC20代币合约详解,附实现代码
- php 开源留言板,PHP开源多功能留言板(SyGuestBook)
- 二、量子通信与量子加密
- discuz X2中template文件夹中模板文件目录
- 2018-06-27 关于小米电力猫小猫一直黄灯闪烁不匹配的问题
- C#实现微信公众号群发消息(解决一天只能发一次的限制)
- Asp连接数据库时的问题Microsoft OLE DB Provider for ODBC Drivers error ‘80004005‘
- 代码分享:面波数据快速成图
- 电信4g网络问题及恢复方案
- MIPS DMIPS MFLOPS名词解释
- maven 项目 springMVC实现文件图片的上传下载功能详解(源码已提供,小白必看)
- sqrt 和pow 的返回值类型错误({从小白开始c语言常见错误归纳第2弹)
- LaTex命令和环境的定义与重定义
- 家教信息管理系统的设计与实现
- python正则库_python 正则表达式第三方库 re的基本使用
热门文章
- echarts大屏模板_大屏数据展示模板智慧城市
- 让计算机工作起来教学反思,计算机教学反思
- 二叉排序树的中序遍历规律_王道数据结构|第四章 树与二叉树 04 二叉树的遍历...
- 巴伦变压器电路图_基于变压器原理的巴伦电路系统分析
- kali字典_Web渗透测试——暴力破解字典制作工具的使用2
- NMS(非极大值抑制)算法 -- 理论、代码
- vscode 左侧图标_分钟将vscode撸成小霸王
- (转) windows 下ORA-12514:TNS 监听问题
- mysql 主从同步机制
- ES6新特性:Javascript中Generator(生成器)