我如何加快在EC2上构建docker映像的速度

问题描述 投票:0回答:1

我目前正在将Rails应用程序部署到单个EC2实例。我是Docker的新手,所以我可能会缺少一些明显的东西。我有2个Dockerfile-应用程序(Rails应用程序)和Web(nginx):

docker
├── app
│   └── Dockerfile
└── web
    ├── Dockerfile
    └── nginx.conf

docker / app / Dockerfile:

FROM ruby:2.5.8
RUN apt-get update && \
apt-get install -y \
curl \
vim \
netcat \
less \
default-mysql-client \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
SHELL ["/bin/bash", "--login", "-i", "-c"]
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
RUN source /root/.bashrc && nvm install 10.19.0
SHELL ["/bin/bash", "--login", "-c"]
RUN npm install -g yarn
RUN yarn install --check-files
RUN mkdir -p /home/ubuntu/zhxword
ENV RAILS_ROOT /home/ubuntu/zhxword
EXPOSE 3000
WORKDIR $RAILS_ROOT
ADD Gemfile $RAILS_ROOT/Gemfile
ADD Gemfile.lock $RAILS_ROOT/Gemfile.lock
ADD . $RAILS_ROOT
RUN gem install bundler
RUN bundle install
RUN bundle exec rake assets:precompile

docker / web / Dockerfile

FROM nginx
RUN apt-get update -qq && apt-get -y install apache2-utils
ENV RAILS_ROOT /var/www/app_name
WORKDIR $RAILS_ROOT
RUN mkdir log
COPY public public/
COPY docker/web/nginx.conf /tmp/docker.nginx
RUN envsubst '$RAILS_ROOT' < /tmp/docker.nginx > /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD [ "nginx", "-g", "daemon off;" ]

MySQL服务器是通过docker-compose.yml引入的:

version: '3.1'

volumes:
  db_data: {}

# This part is explained below the file
services:
  db:
    image: mysql:5.6
    volumes:
       - db_data:/var/lib/mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --init-connect='SET NAMES UTF8;' --innodb-flush-log-at-trx-commit=0
    environment:
      MYSQL_ROOT_PASSWORD: XXXXXX
      MYSQL_DATABASE: zhxword_production
      MYSQL_USER: zhxword
      MYSQL_PASSWORD: XXXXXX
  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    command: /bin/sh -c "bin/wait-for db:3306 -- rm -f /home/ubuntu/zhxword/tmp/pids/server.pid && bundle exec rails server puma -p 3000"
    volumes:
      - $PWD:/zhxword
    ports:
      - "3000:3000"
    links:
      - "db:database"
    env_file:
      - .env.production
    depends_on:
      - db
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    depends_on:
      - app
    ports:
      - "80:80"

我正在使用docker-machine发布到AWS:

docker-machine create --driver amazonec2 --amazonec2-instance-type "t2.micro" production
docker-machine env production
eval $(docker-machine env production)
docker-compose build
docker-compose up -d

问题

针对AWS目标运行docker-compose build大约需要1小时20分钟。

我已经尝试了t2.microt2.medium实例类型,似乎花费了相同的时间。应用程序容器中特别慢的步骤之一是安装具有本机扩展的sassc 2.3.0],但通常应用程序和Web容器都需要很长时间。

在本地(在笔记本电脑上)运行docker-compose build的速度更快-总计约7分钟。针对AWS目标运行docker-compose up只需要一两分钟。

我可以采用哪些策略来加快构建过程?

我目前正在将Rails应用程序部署到单个EC2实例。我是Docker的新手,所以我可能会缺少一些明显的东西。我有2个Dockerfile-app(Rails app)和web(nginx):docker├──app│└──...

docker amazon-ec2 docker-compose docker-machine
1个回答
0
投票
  1. 我真的建议您阅读下一页https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
© www.soinside.com 2019 - 2024. All rights reserved.