I'm trying to bundle my Jekyll blog as a docker container.
I found this Dockerfile which seems to suit my use case but wanted to be more hands on so I copied it directly into my repo:
FROM ruby:latest
MAINTAINER Peter Etelej <peter@etelej.com>
RUN apt-get -qq update && \
apt-get -qq install nodejs -y && \
gem install -q bundler
RUN mkdir -p /etc/jekyll && \
printf 'source "https://rubygems.org"\ngem "github-pages"\ngem "execjs"\ngem "rouge"' > /etc/jekyll/Gemfile && \
printf "\nBuilding required Ruby gems. Please wait..." && \
bundle install --gemfile /etc/jekyll/Gemfile --clean --quiet
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ENV BUNDLE_GEMFILE /etc/jekyll/Gemfile
EXPOSE 4000
ENTRYPOINT ["bundle", "exec"]
CMD ["jekyll", "serve","--host=0.0.0.0"]
When I run it I get an error
jekyll 3.4.3 | Error: No such file or directory @ rb_sysopen - /etc/modules-load.d/modules.conf
The host system has this file but my assumption was that the container didn't have access to it so I tried to add it into the Dockerfile
ADD /etc/modules-load.d/modules.conf /etc/modules-load.d/modules.conf
I then docker build and get the error
lstat etc/modules-load.d/: no such file or directory
I don't understand why the container is looking for this file in the first place but I'm even more confused by the fact that I can't add a file which is clearly there.
答案 0 :(得分:1)
Docker构建在docker主机上运行,不一定是运行命令的客户端,因此运行构建所需的所有文件都在构建上下文中发送到主机。该上下文通常是您在.
命令末尾传递的当前目录或docker build -t $image_name .
。
您尝试在COPY
或ADD
的图像中包含的所有内容都是在引用该构建上下文时完成的,而不是客户端或主机上的文件系统。因此,如果您需要modules.conf,您需要首先使用Dockerfile将其复制到您的目录中,然后从COPY
将文件复制到您的目录中。
至于为什么jekyll正在寻找文件,我对jekyll并不熟悉,但对于在容器内部运行的东西看起来并不乐观。这些模块是特定于内核的,容器被设计为移动到具有可能不同内核的不同主机。