【问题标题】:Docker: Do I need to rebuild the container from scratch whenever I need to add software?Docker:每当我需要添加软件时,我是否需要从头开始重建容器?
【发布时间】:2015-04-15 02:08:22
【问题描述】:

所以我正在试验 Docker,并设置了一个与 postgres 对话的 Rails 应用程序。一切正常,我可以访问应用程序、迁移数据库等。

Dockerfile
FROM ruby:2.2.1

RUN apt-get update -qq && apt-get install -y build-essential
RUN apt-get install -y libxml2-dev libxslt1-dev
RUN apt-get install -y libqt4-webkit libqt4-dev xvfb
RUN apt-get install -y nodejs

ENV APP_HOME /code
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ADD . $APP_HOME
RUN bundle install

docker-compose.yml
web:
  build: .
  command: bin/rails server --port 3000 --binding 0.0.0.0
  ports:
   - "3000:3000"
  volumes:
   - .:/code
  links:
   - db
db:
  image: postgres
  ports:
    - "5432:5432"

在制作了几个模型和一个控制器后,我决定为项目使用 Slim 模板并将其添加到我的 Gemfile 中

gem 'slim'

我本来希望能够通过在其上运行 bundle install 来更新对 Web 容器的依赖:

docker-compose run web bundle install

一开始似乎可以正常工作,它会安装 gem 及其依赖项。然而,这些只是构建容器的一次性副本。下次我运行 docker-compose up 时,IT 不会留下来。

永久获得 gem 的唯一方法是再次从头开始构建 web,这可能需要 3-4 分钟才能再次从头安装所有 gem,这主要是由于 nokigiri。

这是“更新”基本映像的唯一方法吗?我希望我只需要在修改 Dockerfile 本身时进行重建,而从头开始重建是有意义的。

【问题讨论】:

    标签: ruby docker bundler docker-compose


    【解决方案1】:

    如果需要,您还可以通过“提交”对容器所做的更改来更新现有图像。语法是docker commit <container ID> <image>。

    或者,您可以利用构建缓存,将您的 bundle install 命令分离到单独的 gem 安装中。然后你可以将你的新 gem 添加到最后,它会在你重建图像时重用所有以前的层。考虑到可能存在重叠的依赖关系,这可能并不理想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2017-04-19
      • 2023-03-17
      相关资源
      最近更新 更多