Dockerfile自动制作Docker镜像(二)—— 其它常用命令

前言

a. 本文主要为 Docker的视频教程 笔记。

b. 环境为 CentOS 7.0 云服务器

c. 上一篇:Dockerfile 自动制作 Docker 镜像(一)—— 基本命令

Dockerfile 其它命令

1. ADD 和 COPY 命令

在Dockerfile中使用 ADDCOPY 命令向容器中复制文件。但 ADD 会自动解压 tar.gz 包。

例:

[root@VM_0_2_centos ~]# gzip -dc test.tar.gz | tar -tvf -

drwxr-xr-x root/root 0 2020-05-13 20:47 test/

-rw-r--r-- root/root 0 2020-05-13 20:47 test/a.txt

-rw-r--r-- root/root 0 2020-05-13 20:47 test/b.txt

使用 ADD 命令: ADD test.tar.gz / 后

root@ef8d91cfeb67:/# ls -al | grep test

drwxr-xr-x 2 root root 4096 May 13 12:47 test    # 注意此时 test 已经变为目录

使用 COPY 命令:COPY test.tar.gz / 后

root@59c4a123e8fc:/# ls -al | grep test

-rw-r--r-- 1 root root 153 May 13 12:55 test.tar.gz    # 注意此时 test 仍为 tar.gz 包

TIPS:

之前 test.tar.gz 在主机 root 用户的的根目录下,试图使用 ADD ~/test.tar.gz / 的写法来拷贝文件,会报:

ADD failed: stat /var/lib/docker/tmp/docker-builder291398651/~/test.tar.gz: no such file or directory

ADD 和 COPY 只能拷贝当前目录下的文件

cat /var/log/mysqld.log | grep -o root@localhost.*$ | awk '{print $2}' | tail -n 1

2. EXPOSE 命令:

EXPOSE <YOUR_PORT1> <YOUR_PORT2> ...

指定容器中的程序要使用的端口,以便在使用 “-P” 启动容器时,自动做端口映射。一般写在CMD之前。

3. ENTRYPOINT 命令:

将用户启动容器时的输入作为参数给到 ENTRYPOINT 后面的程序。如写为:

ENTRYPOINT ["/bin/bash"]	# dockerfile 中

docker run <IMAGE_ID> some_string	# 执行命令时

则容器实际执行

/bin/bash some_string

4. ENV 命令

用于设置环境变量

5. ENTRYPOINT, ENV 结合使用实现自动设置 mysql 密码

主要思路:

ENTRYPOINT 可以将用户启动容器时的输入变为参数,配合脚本可以完成设置密码的操作。同时为了应对用户不输入的情况,需要使用 ENV 设置一个变量作为默认的密码,并在脚本中加入判断。

Dockerfile 文件:

FROM centos7_mysql
COPY change_mysql_password.sh /
RUN rm -rf /var/lib/mysql
RUN mkdir /var/lib/mysql
RUN mysqld --initialize --user=mysql --datadir=/var/lib/mysql
ENV MYSQL_NEW_PASSWORD=nihao@123
EXPOSE 3306
ENTRYPOINT ["/bin/bash", "/change_mysql_password.sh"] # 只有在执行脚本时才需要/bin/bash

change_mysql_password.sh 文件:

#!/bin/bash
if [ ! -z $1 ];then
MYSQL_NEW_PASSWORD=$1
fi mysqld -u root &
sleep 10 # 极不严谨!在mysql未启动时无法设置密码,而启动需要一定时间,因此睡10s等待启动完成
old_password=`cat /var/log/mysqld.log | grep -o root@localhost.*$ | awk '{print $2}' | tail -n 1`
mysqladmin -u root -p${old_password} password ${MYSQL_NEW_PASSWORD}
touch hang && tail -f hang # 命令执行完成后自动退出,因此需要手工阻塞一下

注意在 Dockerfile 中定义了 MYSQL_NEW_PASSWORD ,调用 change_mysql_password.sh 脚本。于此对应的是在 change_mysql_password.sh 中对 MYSQL_NEW_PASSWORD 进行判断处理。设置的密码强度不能太低否则会设置失败

docker run -it  <IMAGE_ID> lbwnb@123

[root@8d3944657906 /]# netstat -lntup | grep mysqld

tcp6 0 0 :::3306 :: LISTEN 5/mysqld

可以看到 mysql 已经启动。

docker run -it -d 238f7fa4f4a7,不加参数时,密码为 nihao@123;如果后面加参数,则密码为参数值。

其它注意项:

mysqladmin  -u  root  -p${old_password}  password  ${MYSQL_NEW_PASSWORD}

一句中,原来写成了

mysqladmin  -u  root  -p'${old_password}'  password  '${MYSQL_NEW_PASSWORD}'(多了单引号)

发现总是密码错误,单引号的作用应该是把单引号中的部分直接理解为字符串而不作任何处理

6. VOLUME 命令

表示哪些部分映射到卷中,启动容器时使用 --volume, 或者 --volumes-from 加一个已经存在容器的名字。如果运行有VOLUME的镜像而不加 -- volume 或者 --volumes-from 参数,则会新建一个卷。

Dockerfile 文件如:

FROM alpine:latest
RUN mkdir /mydir
COPY index.html /mydir/index.html
RUN touch hang
VOLUME /mydir
CMD ["tail","-f","hang"]

执行启动命令:docker run -it -d 675cc3517e1c,可以看到多出了一个卷:

[root@VM_0_2_centos volume]# docker volume ls

DRIVER VOLUME NAME

local 5701d2644d069ebf07265afe190116ac19d95e89b755ddc9409f2d1649f8297e

使用 --volume 手工指定要使用的卷

docker run -it -d --volume  <VOLUME_ID>:<DIR_IN_CONTAINER_TO_MAP> <IMAGE_ID>

如:

[root@VM_0_2_centos volume]# docker run -it -d --volume 5701d2644d069ebf07265afe190116ac19d95e89b755ddc9409f2d1649f8297e:/mydir 675cc3517e1c

90d52a27e81dbf110e2fd38f5d5889a312ff3baabff37460dfea2a49d8b625f3

使用 --volumes-from 和别的容器共用一个卷,注意无需指定映射目录,自动与容器 id 所对应容器相同:

docker run -it -d --volumes-from <CONTAINER_ID> <IMAGE_ID>

如:

[root@VM_0_2_centos volume]# docker run -it -d --volumes-from 90d52a27e81dbf110e2fd38 675cc3517e1c

b1bb18594adbbfa6fa0cb34302a747db2db04027348a3bd5f8d57393be70ad48

执行以上操作后

[root@VM_0_2_centos volume]# docker volume ls

DRIVER VOLUME NAME

local 5701d2644d069ebf07265afe190116ac19d95e89b755ddc9409f2d1649f8297e

这些容器共用了一个卷,卷中的文件在各个容器中也可以看到。


TIPS: 使用 docker image prune 删除名字和标签均为 “<none> ” 的镜像(强制删除有容器使用的镜像 和 构建过程中被终止时会产生)。

参考:

Dockerfile自动制作Docker镜像(二)—— 其它常用命令的更多相关文章

  1. Dockerfile 自动制作 Docker 镜像(三)—— 镜像的分层与 Dockerfile 的优化

    Dockerfile 自动制作 Docker 镜像(三)-- 镜像的分层与 Dockerfile 的优化 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云 ...

  2. Dockerfile 自动制作 Docker 镜像(一)—— 基本命令

    Dockerfile 自动制作 Docker 镜像(一)-- 基本命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:手动制作Do ...

  3. dockerfile自动创建docker镜像

    特点:类似于ansible 剧本,大小几kb 而,手动做的镜像,要几百M,甚至上G ,传输不方便 dockerfile 支持自定义容器的初始命令 dockerfile只要组成部分: 基础镜像信息 FR ...

  4. 在docker hub,用github的dockerfile自动生成docker镜像

    简介: 我已经深深的爱上了docker技术. 在日常使用中,经常看到docker hub 中有很多autobuild的镜像.基本使用是在github中上传dockerfile,过一会儿,docker ...

  5. 制作Docker镜像的两种方式

    此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...

  6. SpringBoot系列: 制作Docker镜像的全过程

    本文主要参考了 https://segmentfault.com/a/1190000016449865 , 感谢作者的付出. 另外,  在本文中, 演示了Windows+Maven+Docker To ...

  7. [开源]制作docker镜像不依赖linux和Docker环境

    背景 最近群友们经常反馈docker镜像制作起来有点麻烦,我开源的antdeploy工具虽然可以制作镜像但是必须有一个提前:有一台安装好docker的linux服务器.因为大家开发环境基本上都是win ...

  8. docker学习笔记二:常用命令

    docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...

  9. 体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

    关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...

随机推荐

  1. 史上最详细的Android消息机制源码解析

    本人只是Android菜鸡一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 606页Android最新面试题含答案,有兴趣可以点击获取. ...

  2. Nacos 笔记

    Nacos 笔记 目录 Nacos 笔记 1. Nacos简介 1.1 主流配置中心对比 1.2 主流注册中心对比 1.3 Nacos特性 2. 安装启动 支持外部 MySQL 3. 配置管理 3.1 ...

  3. netty系列之:使用UDP协议

    目录 简介 UDP协议 String和ByteBuf的转换 构建DatagramPacket 启动客户端和服务器 总结 简介 在之前的系列文章中,我们到了使用netty做聊天服务器,聊天服务器使用的S ...

  4. 软件或jar包版本的小知识---Beta版、Final版、Free版等

    对于各种软件或jar包,其后面总有不同的"尾巴",如: 等,刚开始接触的肯定有些不知道.那么他们到底代表什么意思呢? 0.Release:发布版 1.Beta版:产品发布之前的测试 ...

  5. shell 获取当前路径 和 2>&1 &的作用

    #!/bin/bash current_path=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) nohup $curren ...

  6. Python 应用爬虫下载QQ音乐

    Python应用爬虫下载QQ音乐 目录: 1.简介怎样实现下载QQ音乐的过程: 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网: https://y.qq.com/,在搜索栏上输入一首 ...

  7. CAS 5.3使用MySQL数据库验证

    一.本例环境说明 JDK 1.8 CAS 5.3 apache-maven-3.6.0 mysql-5.6.32 二.CAS 5.3基础环境搭建与验证 需要按照<CAS 5.3服务器搭建> ...

  8. Sqli-Labs less13-16

    less-13 首先,输入用户名和密码,发现只有成功和失败两种显示,没有数据回显: 然后我们抓包拿到数据: 我们通过上述观察,已经知道这是典型的盲注,可以采用布尔盲注或者时间盲注. 构造注入语句:un ...

  9. 剑指 Offer 68 - II. 二叉树的最近公共祖先

    剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近 ...

  10. Unity遮罩之Mask、RectMask2D与Sprite Mask适用场景分析

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...