怎样在Dockerfile中链接文件?

3

我正在尝试创建一个Dockerfile来部署Rails应用程序,但我的问题是如果我使用Dockerfile,Ruby将无法安装,因为它会显示缺少/dev/fd。在普通机器上,我只需要输入命令ln -sf /proc/self/fd /dev/fd,就能解决所有问题。然而,当我将该命令放入我的Dockerfile中时,它不会链接到/dev/fd。以下是我的Dockerfile:

# Select ubuntu as the base image
FROM ubuntu

# Install nginx, nodejs and curl
RUN apt-get update -q
RUN apt-get install -qy nginx
RUN apt-get install -qy curl
RUN apt-get install -qy nodejs
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Install rvm, ruby, bundler
RUN curl -sSL https://get.rvm.io | bash -s stable
RUN ln -sf /proc/self/fd /dev/fd
RUN echo "source /usr/local/rvm/scripts/rvm" >> /etc/bash.bashrc
RUN /bin/bash -l -c "rvm requirements"
RUN /bin/bash -l -c "rvm install 2.1.2"

我会遇到类似于"/dev/fd: 缺少文件或文件夹"之类的错误。如果我省略最后一行,所有内容都能够成功构建,但是当我登录到刚刚构建的图像并进入/dev/fd目录时,会显示"没有这样的文件或目录"。为什么它可以成功构建但是不会链接我要求的文件呢?

4个回答

7

我尝试使用你运行的命令,它试图创建/dev/fs/fs

请尝试以下方法在/dev/中创建符号链接

RUN ln -sf /proc/self/fd /dev/

1

我的意见是:如果你想混合使用一些服务,请使用之前创建的容器,如果需要,请查看要安装的服务的Dockerfiles,相信你会找到自己的路径。但我建议不要重复造轮子,因为Docker旨在进行再利用,已经有nginx和ruby容器了。此外,我认为在Docker中安装rvm不是一个好主意,如果你只需要不同版本的Ruby,则只需下载具有特定版本的容器即可。


非常感谢这个技巧。它真的很有道理。是的,我是一名计算机安全实验室的实习生,目前正在尝试找出快速高效地部署Rails应用程序的方法。我通过使用在这里得到的所有技巧使其成功了。非常感谢你们所有人! - lgdelacruz
我有运维经验,而且 Docker 是最好的选择!顺便问一下,我至少能得到一个赞吗? - Carlos Castellanos
我尝试了,但是我不能因为我需要有15+的声望。抱歉,我是新来的。 - lgdelacruz

0

你可以尝试在没有rvm的情况下安装Ruby。由于你正在使用Docker容器,它已经被隔离了,因此在这种情况下使用rvm不会得到太多(或任何)好处。

你可以尝试从索引中的基础Ruby镜像构建你的镜像,例如1uptalent/ruby-2.1(免责声明:这是我们公司设置的自动构建),或者从其Dockerfile中借鉴。然后只需在其上添加你的Rails应用程序即可。


很酷,这个构建在Docker镜像中安装了Ruby。但是我不需要安装Rails并运行Rails服务器来运行我的应用程序吗? - lgdelacruz
@user3739610 是的,你可以将它用作你的 FROM 镜像,然后在其上添加你的 Rails 应用程序。 - Abel Muiño
非常感谢。你帮了很多忙! - lgdelacruz
@user3739610 不用谢。如果你觉得有价值的话,可以随意点赞/接受答案。 - Abel Muiño

0

我正在创建类似于Dockerfiles中的链接,但不在/dev文件系统上。

你在一个容器中,可以修改dev文件系统,但当你从创建的镜像重新启动容器时,它会被替换。请参见运行容器中的挂载:

tmpfs on /dev type tmpfs (rw,nosuid,mode=755)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接