将 libvips 添加到 Rails 7 Docker 图像
Adding libvips to a Rails 7 Docker image
我是 Docker 的新手,正在尝试为这个新的 Rails 7 应用程序创建一个 Docker 文件。我使用 vips 而不是 imagemagick 来提高记忆力。
我本地的 machine 是一个 mac 所以 brew install vips
负责我的非 docker 开发流程,但是使用ruby-vips gem,或从源安装。
运行 $ docker compose up
结果:
/usr/local/bundle/gems/ffi-1.15.5/lib/ffi/library.rb:145:in block in ffi_lib': Could not open library 'vips.so.42': vips.so.42: cannot open shared object file: No such file or directory. (LoadError)
具有以下docker-compose.yml:
version: "3.9"
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
和一个Docker文件:
FROM ruby:3.0.1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install ruby-vips
RUN bundle install
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]
我也尝试过使用 ruby-vips 从源代码安装 (https://www.libvips.org/install.html),但没有成功。
TLDR; ruby-vips 需要 libvips42
安装在您的 docker 图像上。
更新您的 Dockerfile 以使用以下内容:
RUN apt-get update -qq && apt-get install -y --no-install-recommends nodejs postgresql-client libvips42
PS:运行 docker compose down
和 docker compose up --build
强制重建您的 docker 图像。
我认为您实际上并没有在 docker 文件中安装 libvips。试试这个:
FROM ruby:3.0.1
RUN apt-get update -qq \
&& apt-get install -y nodejs postgresql-client
RUN apt install -y --no-install-recommends libvips42
WORKDIR /myapp
...
但是,这会安装 buster 自带的 libvips,而且是五年前的 8.7.x (!!)。 Debian 动作不快。
我会从源代码构建当前的 libvips。像这样:
# based on buster
FROM ruby:3.0.1
RUN apt-get update && apt-get install -y \
build-essential \
unzip \
wget \
git \
pkg-config
# stuff we need to build our own libvips ... this is a pretty random selection
# of dependencies, you'll want to adjust these
RUN apt-get install -y \
glib-2.0-dev \
libexpat-dev \
librsvg2-dev \
libpng-dev \
libgif-dev \
libjpeg-dev \
libexif-dev \
liblcms2-dev \
liborc-dev
ARG VIPS_VERSION=8.12.2
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
RUN apt-get install -y \
wget
RUN cd /usr/local/src \
&& wget ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.gz \
&& tar xzf vips-${VIPS_VERSION}.tar.gz \
&& cd vips-${VIPS_VERSION} \
&& ./configure --disable-deprecated \
&& make -j 4 V=0 \
&& make install
RUN gem install ruby-vips
这将不包括对 GIF 保存或 HEIC 或 PDF 等格式的支持。您可能需要稍微调整一下。当然,您不应该在部署 docker 映像中构建包,您需要在单独的 docker 文件中构建包。
希望 ruby-vips 部署在接下来的几个月内变得更加自动化,因为这是 rail7 的默认设置。现在是相当手动的。
我是 Docker 的新手,正在尝试为这个新的 Rails 7 应用程序创建一个 Docker 文件。我使用 vips 而不是 imagemagick 来提高记忆力。
我本地的 machine 是一个 mac 所以 brew install vips
负责我的非 docker 开发流程,但是使用ruby-vips gem,或从源安装。
运行 $ docker compose up
结果:
/usr/local/bundle/gems/ffi-1.15.5/lib/ffi/library.rb:145:in block in ffi_lib': Could not open library 'vips.so.42': vips.so.42: cannot open shared object file: No such file or directory. (LoadError)
具有以下docker-compose.yml:
version: "3.9"
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
和一个Docker文件:
FROM ruby:3.0.1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install ruby-vips
RUN bundle install
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]
我也尝试过使用 ruby-vips 从源代码安装 (https://www.libvips.org/install.html),但没有成功。
TLDR; ruby-vips 需要 libvips42
安装在您的 docker 图像上。
更新您的 Dockerfile 以使用以下内容:
RUN apt-get update -qq && apt-get install -y --no-install-recommends nodejs postgresql-client libvips42
PS:运行 docker compose down
和 docker compose up --build
强制重建您的 docker 图像。
我认为您实际上并没有在 docker 文件中安装 libvips。试试这个:
FROM ruby:3.0.1
RUN apt-get update -qq \
&& apt-get install -y nodejs postgresql-client
RUN apt install -y --no-install-recommends libvips42
WORKDIR /myapp
...
但是,这会安装 buster 自带的 libvips,而且是五年前的 8.7.x (!!)。 Debian 动作不快。
我会从源代码构建当前的 libvips。像这样:
# based on buster
FROM ruby:3.0.1
RUN apt-get update && apt-get install -y \
build-essential \
unzip \
wget \
git \
pkg-config
# stuff we need to build our own libvips ... this is a pretty random selection
# of dependencies, you'll want to adjust these
RUN apt-get install -y \
glib-2.0-dev \
libexpat-dev \
librsvg2-dev \
libpng-dev \
libgif-dev \
libjpeg-dev \
libexif-dev \
liblcms2-dev \
liborc-dev
ARG VIPS_VERSION=8.12.2
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
RUN apt-get install -y \
wget
RUN cd /usr/local/src \
&& wget ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.gz \
&& tar xzf vips-${VIPS_VERSION}.tar.gz \
&& cd vips-${VIPS_VERSION} \
&& ./configure --disable-deprecated \
&& make -j 4 V=0 \
&& make install
RUN gem install ruby-vips
这将不包括对 GIF 保存或 HEIC 或 PDF 等格式的支持。您可能需要稍微调整一下。当然,您不应该在部署 docker 映像中构建包,您需要在单独的 docker 文件中构建包。
希望 ruby-vips 部署在接下来的几个月内变得更加自动化,因为这是 rail7 的默认设置。现在是相当手动的。