SCB
SCB

Reputation: 6149

Some RUNs won't work on docker but will when inside a container

I've got a Dockerfile for some lua and torch related tasks and I'm trying to install some rocks using luarocks.

FROM ubuntu:14.04
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

RUN apt-get update -y
RUN apt-get install -y curl git

RUN curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
RUN git clone https://github.com/torch/distro.git ~/torch --recursive
RUN cd ~/torch; ./install.sh

RUN source ~/.bashrc

RUN luarocks install nngraph
RUN luarocks install optim
RUN luarocks install nn

RUN luarocks install cltorch
RUN luarocks install clnn

docker build runs fine up until the first luarocks call: RUN luarocks install nngraph at which point it stops and throws the error:

/bin/sh: luarocks: command not found

If I comment out the luarocks lines, the build runs fine. Using that image, I can create a container and using bash, run luarocks as expected.

Of course, I don't particularly want to have to do this every time I start up the container, so I'm wondering if there's anything I can do to make this work. I have a feeling that this problem has something to do with the line RUN rm /bin/sh && ln -s /bin/bash /bin/sh but I need that to be able to run the line RUN source ~/.bashrc.

Thanks.

Upvotes: 1

Views: 660

Answers (2)

christian
christian

Reputation: 10208

As Alex da Silva pointed it out, sourcing .bashrc happens in another shell in your Dockerfile.

You could also try that to have your luarocks commands executed in the same shell with your sourced bashrc:

...
RUN source ~/.bashrc && luarocks install nngraph
RUN source ~/.bashrc && luarocks install optim
RUN source ~/.bashrc && luarocks install nn

RUN source ~/.bashrc && luarocks install cltorch
RUN source ~/.bashrc && luarocks install clnn

Upvotes: 2

Alex da Silva
Alex da Silva

Reputation: 4590

Each RUN command runs on its own shell and a new layer is committed.

From the Docker documentations:

RUN (the command is run in a shell - /bin/sh -c - shell form)

So when you run luarocks install <app> it will not be the same shell you source your profile.

You have to provide the full path for luarocks to run. See below a modified Dockerfile I successfully run:

FROM ubuntu:14.04
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

RUN apt-get update -y
RUN apt-get install -y curl git

RUN curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
RUN git clone https://github.com/torch/distro.git ~/torch --recursive
RUN cd ~/torch; ./install.sh

RUN source ~/.bashrc

RUN /root/torch/install/bin/luarocks install nngraph
RUN /root/torch/install/bin/luarocks install optim
RUN /root/torch/install/bin/luarocks install nn
RUN /root/torch/install/bin/luarocks install cltorch
RUN /root/torch/install/bin/luarocks install clnn

For more details see docker RUN documentation here.

Upvotes: 4

Related Questions