创build第一个docker容器:在build上找不到主机系统文件

我试图把我的Jekyll博客作为docker集装箱。

我发现这个Dockerfile似乎适合我的用例,但想要更多的手,所以我直接复制到我的回购:

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"] 

当我运行它时,我得到一个错误

jekyll 3.4.3 | Error: No such file or directory @ rb_sysopen - /etc/modules-load.d/modules.conf

主机系统有这个文件,但我的假设是容器没有访问它,所以我试图将其添加到Dockerfile

ADD /etc/modules-load.d/modules.conf /etc/modules-load.d/modules.conf

我然后dockerbuild设,并得到错误

lstat etc/modules-load.d/: no such file or directory

我不明白为什么容器首先在寻找这个文件,但是我更加困惑的是我无法添加一个明显存在的文件。

Docker构build在Docker主机上运行,​​不一定是运行命令的客户端,因此运行构build所需的所有文件都在构build上下文中发送到主机。 该上下文通常是当前目录,或者. ,你在docker build -t $image_name .的末尾传递docker build -t $image_name . 命令。

所有你试图包含在图像中的COPYADD都是参考这个构build上下文来完成的,而不是你的客户机或主机上的文件系统。 所以,如果你需要一个modules.conf,你需要先用Dockerfile将它复制到你的目录中,然后从那里COPY文件。

至于为什么jekyll正在寻找这个文件,我对jekyll并不熟悉,但是对于在容器内运行的东西来说,这看起来并不怎么样。 这些模块是特定于内核的,并且容器被devise为被移动到具有可能不同的内核的不同主机。