zoukankan      html  css  js  c++  java
  • [Docker] Create a base container

    Base container can make Docker build much faster.

    • Our original Dockerfile contained a lot of code to install NodeJS that takes a long time to run.

    • Installing NodeJS is a redundant operation -- it shouldn't need to be reinstalled every time we build an image because we don’t expect to make changes to it.

    • By using a base image that has NodeJS installed, we can reduce the amount of time it takes to build an image for NodeJS and our application’s code. We would use a pre-existing image that already has NodeJS and just build on top of it for the application’s code.

    original Dockerfile

    FROM buildpack-deps:stretch
    
    # Install NodeJS dependencies
    RUN groupadd --gid 1000 node 
      && useradd --uid 1000 --gid node --shell /bin/bash --create-home node
    
    ENV NODE_VERSION 13.12.0
    
    RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" 
      && case "${dpkgArch##*-}" in 
        amd64) ARCH='x64';; 
        ppc64el) ARCH='ppc64le';; 
        s390x) ARCH='s390x';; 
        arm64) ARCH='arm64';; 
        armhf) ARCH='armv7l';; 
        i386) ARCH='x86';; 
        *) echo "unsupported architecture"; exit 1 ;; 
      esac 
      # gpg keys listed at https://github.com/nodejs/node#release-keys
      && set -ex 
      && for key in 
        94AE36675C464D64BAFA68DD7434390BDBE9B9C5 
        FD3A5288F042B6850C66B31F09FE44734EB7990E 
        71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 
        DD8F2338BAE7501E3DD5AC78C273792F7D83545D 
        C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 
        B9AE9905FFD7803F25714661B63B535A4C206CA9 
        77984A986EBC2AA786BC0F66B01FBB92821C587A 
        8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 
        4ED778F539E3634C779C87C6D7062848A1AB005C 
        A48C2BEE680E841632CD4E44F07496B3EB3C1762 
        B9E2F5981AA6E0CD28160D9FF13993A75599653C 
      ; do 
        gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || 
        gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || 
        gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; 
      done 
      && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" 
      && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" 
      && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc 
      && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz$" SHASUMS256.txt | sha256sum -c - 
      && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner 
      && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt 
      && ln -s /usr/local/bin/node /usr/local/bin/nodejs 
      # smoke tests
      && node --version 
      && npm --version
    
    ENV YARN_VERSION 1.22.4
    
    RUN set -ex 
      && for key in 
        6A010C5166006599AA17F08146C2130DFD2497F5 
      ; do 
        gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || 
        gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || 
        gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; 
      done 
      && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" 
      && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" 
      && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz 
      && mkdir -p /opt 
      && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ 
      && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn 
      && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg 
      && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz 
      # smoke test
      && yarn --version
    
    # Create app directory
    WORKDIR /usr/src/app
    
    # Install app dependencies by copying
    # package.json and package-lock.json
    COPY package*.json ./
    
    # Install dependencies
    RUN npm install
    
    # Copy app source
    COPY . .
    
    # Bind the port that the image will run on
    EXPOSE 8080
    
    # Define the Docker image's behavior at runtime
    CMD ["node", "server.js"]

    A base docker image:

    FROM buildpack-deps:stretch
    
    # Install NodeJS dependencies
    RUN groupadd --gid 1000 node 
      && useradd --uid 1000 --gid node --shell /bin/bash --create-home node
    
    ENV NODE_VERSION 13.12.0
    
    RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" 
      && case "${dpkgArch##*-}" in 
        amd64) ARCH='x64';; 
        ppc64el) ARCH='ppc64le';; 
        s390x) ARCH='s390x';; 
        arm64) ARCH='arm64';; 
        armhf) ARCH='armv7l';; 
        i386) ARCH='x86';; 
        *) echo "unsupported architecture"; exit 1 ;; 
      esac 
      # gpg keys listed at https://github.com/nodejs/node#release-keys
      && set -ex 
      && for key in 
        94AE36675C464D64BAFA68DD7434390BDBE9B9C5 
        FD3A5288F042B6850C66B31F09FE44734EB7990E 
        71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 
        DD8F2338BAE7501E3DD5AC78C273792F7D83545D 
        C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 
        B9AE9905FFD7803F25714661B63B535A4C206CA9 
        77984A986EBC2AA786BC0F66B01FBB92821C587A 
        8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 
        4ED778F539E3634C779C87C6D7062848A1AB005C 
        A48C2BEE680E841632CD4E44F07496B3EB3C1762 
        B9E2F5981AA6E0CD28160D9FF13993A75599653C 
      ; do 
        gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || 
        gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || 
        gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; 
      done 
      && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" 
      && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" 
      && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc 
      && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz$" SHASUMS256.txt | sha256sum -c - 
      && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner 
      && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt 
      && ln -s /usr/local/bin/node /usr/local/bin/nodejs 
      # smoke tests
      && node --version 
      && npm --version
    
    ENV YARN_VERSION 1.22.4
    
    RUN set -ex 
      && for key in 
        6A010C5166006599AA17F08146C2130DFD2497F5 
      ; do 
        gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || 
        gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || 
        gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; 
      done 
      && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" 
      && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" 
      && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz 
      && mkdir -p /opt 
      && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ 
      && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn 
      && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg 
      && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz 
      # smoke test
      && yarn --version
    
    CMD ["node"] ## Run node env

    So, we have a docker file only do the process for node env.

    Build image:

    docker build -t slow-node-base .

    Tag image and push to registry:

    docker tag slow-node-base <username>/slow-node-base
    docker push <username>/slow-node-base

    So our new Dockerfile looks like:

    FROM <username>/slow-node-base:latest
    
    # Create app directory
    WORKDIR /usr/src/app
    
    # Install app dependencies by copying
    # package.json and package-lock.json
    COPY package*.json ./
    
    # Install dependencies
    RUN npm install
    
    # Copy app source
    COPY . .
    
    # Bind the port that the image will run on
    EXPOSE 8080
    
    # Define the Docker image's behavior at runtime
    CMD ["node", "server.js"]

    Then run the docker will be faster.

  • 相关阅读:
    UVa 1331 最大面积最小的三角剖分
    UVa 1626 括号序列(矩阵连乘)
    POJ 3295 Tautology(构造法)
    POJ 2586 Y2K Accounting Bug(贪心)
    POJ 2109 Power of Cryptography
    abcd
    好数
    Gift
    密码游戏
    约瑟夫游戏
  • 原文地址:https://www.cnblogs.com/Answer1215/p/14601189.html
Copyright © 2011-2022 走看看