如何将包添加到已经存在的图像?

我有一个使用在Gemfile中指定的imagemagick的RoR应用程序。 我使用Docker的官方导轨图像来构build我的图像与以下Dockerfile:

FROM rails:onbuild RUN apt-get install imagemagick 

并得到以下错误:

 Cant install RMagick 2.13.2. Cant find Magick-config in /usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 

现在,这可能是因为在操作系统上缺lessimagemagic软件包,即使我在Dockerfile中指定了它。 所以我猜在RUN apt-get命令之前发出了bundle install命令。
我的问题 – 使用这个基本的形象,有没有一种方法来确保imagemagic在捆绑之前安装?
我是否需要fork和更改基础图像Dockerfile来实现?

你是对的,来自rails的ONBUILD指令:onbuild图像将在Dockerfile的FROM指令之后执行。

我build议的是改变你的Dockerfile如下:

 FROM ruby:2.2.0 RUN apt-get install imagemagick # throw errors if Gemfile has been modified since Gemfile.lock RUN bundle config --global frozen 1 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y mysql-client postgresql-client sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/* COPY Gemfile /usr/src/app/ COPY Gemfile.lock /usr/src/app/ RUN bundle install COPY . /usr/src/app EXPOSE 3000 CMD ["rails", "server"] 

我根据rails制作的:onbuild Dockerfile移动ONBUILD指令并删除ONBUILD风格。

大多数软件包会清理caching以节省大小。 尝试这个:

 apt-get update && apt-get install imagemagick 

或者将一个容器的副本放在一边查找自己

 docker run -it --remove <mycontainernameorid> /bin/bash 

–remove将确保在退出shell后将容器移除。 一旦在shell中查找包二进制文件(或者dpkg –list)