当前位置: 首页 > 面试题库 >

如何在没有构建工具的情况下为Ruby项目构建Docker映像?

须捷
2023-03-14
问题内容

我正在尝试为Ruby项目构建Docker映像。问题在于该项目具有一些gem依赖项,需要构建本机扩展。我的理解是,我有两种选择:

  1. 从已经安装了构建工具的基础映像开始。
  2. 使用没有构建工具的基础映像,并在运行之前在Dockerfile中安装构建工具bundle install
  3. 在主机上预编译本机扩展,将gem供应商化,然后简单地将生成的包复制到映像中。

1和2似乎要求生成的映像包含构建本机扩展所需的构建工具。出于安全原因,我正在尝试避免这种情况。3很麻烦,但是可行,并且可以完成我想要的。

我有什么选择或者我误会了吗?


问题答案:

我一直在使用选项3,目标是最终得到只包含我需要 运行 的图像(而不是编译)

例如,在这里,我首先构建并安装Apache,然后再使用生成的映像作为我的(修补和重新编译的)Apache安装程序的基础映像。

建立:

if [ "$(docker images -q apache.deb 2> /dev/null)" = "" ]; then
  docker build -t apache.deb -f Dockerfile.build . || exit 1
fi

所述Dockerfile.build声明包含所得的Apache重新编译(在DEB文件)的体积

RUN checkinstall --pkgname=apache2-4 --pkgversion="2.4.10" --backup=no --deldoc=yes --fstrans=no --default
RUN mkdir $HOME/deb && mv *.deb $HOME/deb
VOLUME /root/deb

安装:

if [ "$(docker images -q apache.inst 2> /dev/null)" = "" ]; then
    docker inspect apache.deb.cont > /dev/null 2>&1 || docker run -d -t --name=apache.deb.cont apache.deb
    docker inspect apache.inst.cont > /dev/null 2>&1 || docker run -u root -it --name=apache.inst.cont --volumes-from apache.deb.cont --entrypoint "/bin/sh" openldap -c "dpkg -i /root/deb/apache2-4_2.4.10-1_amd64.deb"
    docker commit apache.inst.cont apache.inst
    docker rm apache.deb.cont apache.inst.cont
fi

在这里,我使用另一个映像(在我的情况下为’openldap’)作为基本映像安装deb:

docker run -u root -it --name=apache.inst.cont --volumes-from apache.deb.cont --entrypoint "/bin/sh" openldap -c "dpkg -i /root/deb/apache2-4_2.4.10-1_amd64.deb"
docker commit apache.inst.cont apache.inst

最后,我从刚提交的映像开始有一个常规的Dockerfile。

FROM apache.inst:latest

psmith指出在评论建筑最小泊坞图片为Rails应用程序从杰瑞Kolehmainen。
对于ruby应用程序,可以使用以下命令轻松删除构建所需的部分:

bundle install --without development test && \
apk del build-dependencies

由于无论如何都需要使用ruby来 运行 应用程序,因此在这种情况下效果很好。

就我而言,我仍然需要一个单独的映像来进行构建,gcc而运行Apache并不需要(它非常大,带有多个依赖项,其中一些依赖于Apache在运行时需要,而有些则没有…)



 类似资料:
  • 我已经按照这些教程为我的Spring Boot应用程序构建Docker映像,该应用程序使用Maven作为构建工具。我正在Windows10机器上使用boot2docker VM,将我的项目从Bitbucker存储库克隆到VM。 > 使用用于DockerFile的Spotify maven插件。尝试运行./mvnw来构建JAR和Docker映像。但是,我没有在boot2docker中安装Java。因

  • 我正在寻找一种方法来刷新我的渐变依赖关系,而不必重新生成项目。我正在使用智能和它的渐变包装器。我尝试过从 IntelliJ 的 gradle UI 运行任务“依赖关系”,我尝试过运行命令 和 ,两者都不起作用。让 gradle 下载新依赖项的唯一方法是使用来自 IntelliJ UI ,但我不喜欢这样做,因为 gradle 会自动运行一些我不想运行的任务,而我只想刷新依赖项。

  • 每次我在eclipse中创建一个android项目时,除了作为项目添加的appcompat_v7之外,它都以错误“没有找到与给定名称匹配的资源:attr xxx”开始。 我找到了一种方法来解决此问题,方法是完全删除操作栏,避免使用少于API 11,修改所有XML文件并删除创建的appcompat_v7项目。但是,这个解决方案很繁琐,每次我需要创建一个简单的项目时都必须完成。 我的问题不是“什么是a

  • 我在工作中坐在防火墙后面,无法连接到通常的外部网站来开始使用Docker。是否可以从. iso文件或类似的文件构建Docker Base Image。

  • 我正在创建一个Android应用程序,使用一个普通的谷歌驱动器帐户作为一个应用程序-养号,如上所述,以令人难以置信的简洁,这里: 使用常规Google帐户作为应用程序拥有的帐户 不幸的是,有关如何在云端硬盘上执行任何操作的所有说明都指向客户端密钥,如下所述: Google API控制台-缺少客户端机密 对于已安装的应用程序,这实际上不再存在。我设法通过构建一个实际的网页,在难以置信的痛苦中获得了O

  • 我有一个简单的gradle项目,我想建立在Docker容器内 我有一个多级码头建设。第一阶段只是从github克隆项目。第二阶段必须建立项目,所以我可以在最后阶段运行它。但是它失败了 命令<代码>。/gradlew build - stacktrace无法执行并失败,错误为: 和stacktraces: 为什么docker用户没有在工作目录下创建文件的权限,如何添加这些权限?简单的< code >