docker run -i -t image / bin / bash - 首先是源文件

时间:2014-04-12 14:35:06

标签: bash docker

这有效:

# echo 1 and exit:
$ docker run -i -t image /bin/bash -c "echo 1"
1
# exit

# echo 1 and return shell in docker container:
$ docker run -i -t image /bin/bash -c "echo 1; /bin/bash"
1
root@4c064f2554de:/# 

问题:我怎样才能source一个文件进入shell? (这不起作用)

$ docker run -i -t image /bin/bash -c "source <(curl -Ls git.io/apeepg) && /bin/bash"
# content from http://git.io/apeepg is sourced and shell is returned
root@4c064f2554de:/# 

4 个答案:

答案 0 :(得分:4)

就我而言,我在Dockerfile中使用RUN source命令(将使用/ bin / bash运行)来为node.js安装nvm

这是一个例子。

FROM ubuntu:14.04

RUN rm /bin/sh && ln -s /bin/bash /bin/sh
...
...
RUN source ~/.nvm/nvm.sh && nvm install 0.11.14

答案 1 :(得分:1)

我想要类似的东西,并在你的想法上稍微扩展一下,想出了以下内容:

docker run -ti --rm ubuntu \
  bash -c 'exec /bin/bash --rcfile /dev/fd/1001 \
                          1002<&0 \
                          <<<$(echo PS1=it_worked: ) \
                          1001<&0 \
                          0<&1002'
  • --rcfile /dev/fd/1001将使用该文件描述符的内容而不是.bashrc
  • 1002<&0保存标准输入法
  • <<<$(echo PS1=it_worked: )PS1=it_worked:置于stdin
  • 1001<&0将此stdin移动到fd 1001,我们将其用作rcfile
  • 0<&1002恢复我们最初保存的标准输入

答案 2 :(得分:1)

您可以在互动容器中使用.bashrc

RUN curl -O git.io/apeepg.sh && \
    echo 'source apeepg.sh' >> ~/.bashrc

然后像docker run -it --rm some/image bash一样照常运行。

请注意,可以使用交互式容器。

答案 3 :(得分:-2)

我认为你不能这样做,至少现在不行。你可以做的是修改你的图像,并添加你想要的文件,如:

FROM image
ADD my-file /my-file
RUN ["source", "/my-file", "&&", "/bin/bash"]