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.

  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/Answer1215/p/14601189.html
Copyright © 2011-2022 走看看