gpt4 book ai didi

docker - 如何加快在 EC2 上构建 docker 镜像

转载 作者:行者123 更新时间:2023-12-02 18:50:34 25 4
gpt4 key购买 nike

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

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

docker/应用程序/docker 文件:
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/网络/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

问题

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

我都试过了 t2.microt2.medium实例类型,并且似乎需要相同的时间。应用程序容器中特别慢的步骤之一是安装带有 native 扩展的 sassc 2.3.0,但通常应用程序和 Web 容器都需要很长时间。

运行 docker-compose build本地(在我的笔记本电脑上)要快得多 - 总共大约 7 分钟。运行 docker-compose up只需一两分钟即可针对 AWS 目标。

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

最佳答案

  • 我真的建议阅读以下页面https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
  • 阅读多阶段构建,它可能有助于加快构建速度

  • 从您的 rails docker 文件一目了然,我发现 RUN 指令有很多不好的用法。这会创建冗余层。
    如果您的 Rails 应用程序基于大图像,请尝试搜索较小的图像,例如 2.7.1-alpine3.11 .

    关于docker - 如何加快在 EC2 上构建 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62256341/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com