无法在Dockerfile中运行source命令。

6

这是Dockerfile中的脚本。当我直接进入Docker并手动运行命令时,它可以正常工作,但为什么不能从Dockerfile中运行。

Dockerfile:

FROM ubuntu:16.04
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN apt-get update
RUN apt-get install -y build-essential libssl-dev
RUN apt-get install -y curl git sudo

RUN curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh -o install_nvm.sh
RUN /bin/sh install_nvm.sh
RUN source ~/.profile

错误:

mesg: ttyname 失败: 设备不支持 ioctl 操作

我尝试了一些解决方案,例如运行以下命令:RUN /bin/sh -c "source ~/.profile",但问题仍未解决。


1
~/.profile文件里面有什么内容? - Jack Gore
它只有一个用于设置环境变量的命令。 https://pastebin.com/RpQg58r4 @JackGore - Tara Prasad Gurung
你应该只使用所需版本的标准节点映像,而不是尝试安装nvm。即使你可以运行. $HOME/.profile,请注意这将是一个无操作,因为该shell环境不会传递到后续步骤。 - David Maze
那里的解决方案对我没有起作用。 - Tara Prasad Gurung
2个回答

1
这非常类似于这个问题:如何解决Vagrant中的'ttyname failed: Inappropriate ioctl for device'问题?~/.profile文件中,有一行代码:
mesg n || true

那是不兼容的。为了解决问题,需要将其与 tty 是否可用做条件判断(credit Gogowitsch)。
RUN sed -i ~/.profile -e 's/mesg n || true/tty -s \&\& mesg n/g'

这个sed命令将mesg n || true(试一下,如果失败就忽略)替换为tty -s && mesg n(只有在成功的情况下才尝试),这样可以消除错误信息。

0
尝试用以下命令替换您的命令。 RUN /bin/bash -c“source〜/ .profile”

1
无论是 /bin/sh 还是 /bin/bash,都是相同的。 - Tara Prasad Gurung

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