Docker:通过容器生成镜像的三种方法

打印 上一主题 下一主题

主题 861|帖子 861|积分 2583

Docker中有时必要修改别人制作好的镜像,一般的方法就是通过创建镜像的容器,将容器进行修改,之后通过容器创建新的镜像。本文重要介绍Docker 将容器生成镜像的三种方法。
1、使用docker commit创建镜像(推荐)


  • 查看容器ID docker ps -a
  • 通过容器ID创建镜像
2、使用docker export和docker import创建镜像


  • 查看容器ID docker ps -a
  • 导出容器到文件 docker export > img.tar
  • 加载保存的容器创建镜像 docker import img.tar :[TAG]
**留意:**使用此方法也可以将容器进行压缩,另外这样创建的容器可能不能正常启动,我们还必要指定一下启动必要参数,例如,entrypoint、cmd和环境变量等。
3、使用tar导出容器创建镜像


  • 进入容器 sudo docker exec -it /bin/bash
  • 生成镜像文件 tar -cvf img.tar --exclude=/proc --exclude=/sys --exclude=img.tar /
  • 将容器中生成的文件拷贝到宿主机 sudo docker cp :/img.tar .
  • 创建生成镜像 cat img.tar | sudo docker import - :[TAG]
**留意:**使用此方法也可以将容器进行压缩,另外这样创建的容器可能不能正常启动,我们还必要指定一下启动必要参数,例如,entrypoint、cmd和环境变量等。
4、查看镜像的Dockerfile的方法


  • 使用docker history查看信息通过docker history查看镜像信息来分析生成Dockerfile。但少了FROM指令信息,多出来自BASIC_IMAGE的一些指令信息。
  • 使用DockerImage2Df容器工具
  1. docker commit -m "oracle 11g" d038360bc3b8 cjavapy/oracle11g:latest
  2. docker commit用法:docker commit  参数  容器名或容器id  镜像名。
  3. 参数说明:
  4. -a:提交的镜像作者;
  5. -c:使用Dockerfile指令来创建镜像;
  6. -m:提交时的说明文字;
  7. -p:在commit时,将容器暂停。(默认选项)
复制代码
  1. #!/bin/bash
  2. set -u
  3. USAGE_TIPS="Usage: ./dfimage.sh <IMAGE>"
  4. if [ !$1 ];
  5.    echo ${USAGE_TIPS}
  6.    exit 1
  7. fi
  8. case "$OSTYPE" in
  9.     linux*)
  10.         docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
  11.         tac                                                    | # reverse the file
  12.         sed 's,^\(|3.*\)\?/bin/\(ba\)\?sh -c,RUN,'             | # change /bin/(ba)?sh calls to RUN
  13.         sed 's,^RUN #(nop) *,,'                                | # remove RUN #(nop) calls for ENV,LABEL...
  14.         sed 's,  *&&  *, \\\n \&\& ,g'                           # pretty print multi command lines following Docker best practices
  15.     ;;
  16.     darwin*)
  17.         docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
  18.         tail -r                                                | # reverse the file
  19.         sed -E 's,^(\|3.*)?/bin/(ba)?sh -c,RUN,'               | # change /bin/(ba)?sh calls to RUN
  20.         sed 's,^RUN #(nop) *,,'                                | # remove RUN #(nop) calls for ENV,LABEL...
  21.         sed $'s,  *&&  *, \\\ \\\n \&\& ,g'                      # pretty print multi command lines following Docker best practices
  22.     ;;
  23.     *)
  24.         echo "unknown OSTYPE: $OSTYPE"
  25.     ;;
  26. esac
复制代码
将上面内容存为dfimage.sh,使用方法如下,
  1. dfimage hanxiao/mynginx:4.1
复制代码
  1. # 命令alias
  2. echo "alias image2df='docker run -v /var/run/docker.sock:/var/run/docker.sock --rm cucker/image2df'" >> ~/.bashrc
  3. . ~/.bashrc
  4. # 使用方法
  5. image2df <IMAGE
复制代码
项目地址**:**https://github.com/cucker0/dockerimage2df
  1. $ echo "alias image2df='docker run -v /var/run/docker.sock:/var/run/docker.sock --rm cucker/image2df'" >> ~/.bashrc
  2. $ . ~/.bashrc
  3. $ docker pull mysql
  4. $ image2df mysql
  5. ========== Dockerfile ==========
  6. FROM mysql:latest
  7. RUN groupadd -r mysql && useradd -r -g mysql mysql
  8. RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*
  9. ENV GOSU_VERSION=1.12
  10. RUN set -eux; \
  11.     savedAptMark="$(apt-mark showmanual)"; \
  12.     apt-get update; \
  13.     apt-get install -y --no-install-recommends ca-certificates wget; \
  14.     rm -rf /var/lib/apt/lists/*; \
  15.     dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
  16.     wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
  17.     wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
  18.     export GNUPGHOME="$(mktemp -d)"; \
  19.     gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
  20.     gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
  21.     gpgconf --kill all; \
  22.     rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
  23.     apt-mark auto '.*' > /dev/null; \
  24.     [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
  25.     apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
  26.     chmod +x /usr/local/bin/gosu; \
  27.     gosu --version; \
  28.     gosu nobody true
  29. RUN mkdir /docker-entrypoint-initdb.d
  30. RUN apt-get update && apt-get install -y --no-install-recommends \
  31.         pwgen \
  32.         openssl \
  33.         perl \
  34.         xz-utils \
  35.     && rm -rf /var/lib/apt/lists/*
  36. RUN set -ex; \
  37.     key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \
  38.     export GNUPGHOME="$(mktemp -d)"; \
  39.     gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
  40.     gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \
  41.     gpgconf --kill all; \
  42.     rm -rf "$GNUPGHOME"; \
  43.     apt-key list > /dev/null
  44. ENV MYSQL_MAJOR=8.0
  45. ENV MYSQL_VERSION=8.0.24-1debian10
  46. RUN echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-8.0' > /etc/apt/sources.list.d/mysql.list
  47. RUN { \
  48.         echo mysql-community-server mysql-community-server/data-dir select ''; \
  49.     echo mysql-community-server mysql-community-server/root-pass password ''; \
  50.     echo mysql-community-server mysql-community-server/re-root-pass password ''; \
  51.     echo mysql-community-server mysql-community-server/remove-test-db select false; \
  52.     } | debconf-set-selections \
  53.     && apt-get update \
  54.     && apt-get install -y \
  55.         mysql-community-client="${MYSQL_VERSION}" \
  56.         mysql-community-server-core="${MYSQL_VERSION}" \
  57.     && rm -rf /var/lib/apt/lists/* \
  58.     && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
  59.     && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
  60.     && chmod 1777 /var/run/mysqld /var/lib/mysql
  61. VOLUME [/var/lib/mysql]
  62. COPY dir:2e040acc386ebd23b8571951a51e6cb93647df091bc26159b8c757ef82b3fcda in /etc/mysql/
  63. COPY file:345a22fe55d3e6783a17075612415413487e7dba27fbf1000a67c7870364b739 in /usr/local/bin/
  64. RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
  65. ENTRYPOINT ["docker-entrypoint.sh"]
  66. EXPOSE 3306 33060
  67. CMD ["mysqld"]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表