Dokcer中使用的Image镜像可能别人写好,我们下载来直接使用,但有些情况可能不能满足我们的需求,那就需要修改镜像,一般可以通过在容器中修改,之后在生成镜像,但有时则需要通过写Dockerfile来重新生成。本文主要介绍Docker中查看Image镜像的Dockerfile的方法。

1、创建测试镜像

Dockerfile:

FROM centos
LABEL maintainer="NGINX Docker Maintainers docker-maint@nginx.com"
RUN yum install -y nginx
RUN echo "Nginx Web: CMD defining default arguments for an ENTRYPOINT" > /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["-g", "daemon off;"]
ENTRYPOINT ["/usr/sbin/nginx"]

生成镜像:

docker build -t cjavapy/nginx:v1 .

2、使用docker history

文档地址:https://github.com/cucker0/docker/blob/main/md/%E7%94%B1docker%E9%95%9C%E5%83%8F%E9%80%86%E5%90%91%E7%94%9F%E6%88%90Dockerfile.md

1)命令

docker history --format {{.CreatedBy}} --no-trunc=true 镜像 |
    sed "s,/bin/\(ba\)\?sh[ ]-c[ ]\#(nop)[ ][ ]*,,g" |
    sed "s,/bin/\(ba\)\?sh[ ]-c,RUN,g" |
    sed 's,  *&&  *, \\\n \&\& ,g' |
    tac

2)命令用法

docker history --format {{.CreatedBy}} --no-trunc=true cjavapy/nginx:v1 |
    sed "s,/bin/\(ba\)\?sh[ ]-c[ ]\#(nop)[ ][ ]*,,g" |
    sed "s,/bin/\(ba\)\?sh[ ]-c,RUN,g" |
    sed 's,  *&&  *, \\\n \&\& ,g' |
    tac

3、使用DockerImage2Df容器工具

文档地址:https://github.com/cucker0/dockerimage2df

1)创建alias命令

echo "alias image2df='docker run -v /var/run/docker.sock:/var/run/docker.sock --rm cucker/image2df'" >> ~/.bashrc
. ~/.bashrc

2)用法

$ echo "alias image2df='docker run -v /var/run/docker.sock:/var/run/docker.sock --rm cucker/image2df'" >> ~/.bashrc
$ . ~/.bashrc
$ image2df nginx

# ========== Dockerfile ==========
FROM nginx:latest
LABEL maintainer=NGINX Docker Maintainers 
ENV NGINX_VERSION=1.23.3
ENV NJS_VERSION=0.7.9
ENV PKG_RELEASE=1~bullseye
RUN set -x\
     && addgroup --system --gid 101 nginx\
     && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx\
     && apt-get update\
     && apt-get install --no-install-recommends --no-install-suggests -y gnupg1 ca-certificates\
     &&\
     NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62;\
    found='';\
    for server in\
         hkp://keyserver.ubuntu.com:80\
         pgp.mit.edu\
     ; do\
         echo "Fetching GPG key $NGINX_GPGKEY from $server";\
    apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break;\
    done;\
    test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1;\
    apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/*\
     && dpkgArch="$(dpkg --print-architecture)"\
     && nginxPackages="\
         nginx=${NGINX_VERSION}-${PKG_RELEASE}\
         nginx-module-xslt=${NGINX_VERSION}-${PKG_RELEASE}\
         nginx-module-geoip=${NGINX_VERSION}-${PKG_RELEASE}\
         nginx-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE}\
         nginx-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE}\
     "\
     && case "$dpkgArch" in\
         amd64|arm64)\
             echo "deb https://nginx.org/packages/mainline/debian/ bullseye nginx" >> /etc/apt/sources.list.d/nginx.list\
             && apt-get update\
             ;;\
    *)\
             echo "deb-src https://nginx.org/packages/mainline/debian/ bullseye nginx" >> /etc/apt/sources.list.d/nginx.list\
                         && tempDir="$(mktemp -d)"\
             && chmod 777 "$tempDir"\
                         && savedAptMark="$(apt-mark showmanual)"\
                         && apt-get update\
             && apt-get build-dep -y $nginxPackages\
             && (\
                 cd "$tempDir"\
                 && DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)"\
                     apt-get source --compile $nginxPackages\
             )\
                         && apt-mark showmanual | xargs apt-mark auto > /dev/null\
             && { [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; }\
                         && ls -lAFh "$tempDir"\
             && ( cd "$tempDir" && dpkg-scanpackages . > Packages )\
             && grep '^Package: ' "$tempDir/Packages"\
             && echo "deb [ trusted=yes ] file://$tempDir ./" > /etc/apt/sources.list.d/temp.list\
             && apt-get -o Acquire::GzipIndexes=false update\
             ;;\
    esac\
         && apt-get install --no-install-recommends --no-install-suggests -y\
                         $nginxPackages\
                         gettext-base\
                         curl\
     && apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx.list\
         && if [ -n "$tempDir" ]; then\
         apt-get purge -y --auto-remove\
         && rm -rf "$tempDir" /etc/apt/sources.list.d/temp.list;\
    fi\
     && ln -sf /dev/stdout /var/log/nginx/access.log\
     && ln -sf /dev/stderr /var/log/nginx/error.log\
     && mkdir /docker-entrypoint.d
COPY file:7b307b62e82255f040c9812421a30090bf9abf3685f27b02d77fcca99f997911 in /
COPY file:5c18272734349488bd0c94ec8d382c872c1a0a435cca13bd4671353d6021d2cb in /docker-entrypoint.d
COPY file:abbcbf84dc17ee4454b6b2e3cf914be88e02cf84d344ec45a5b31235379d722a in /docker-entrypoint.d
COPY file:e57eef017a414ca793499729d80a7b9075790c9a804f930f1417e56d506970cf in /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

推荐文档