How to run two commands on Dockerfile?
Asked Answered
C

4

11

I have to execute two commands on the docker file, but both these commands are attached to the terminal and block the execution from the next.

dockerfile:

FROM sinet/nginx-node:latest

RUN mkdir /usr/src/app

WORKDIR /usr/src/app

RUN git clone https://name:[email protected]/joaocromg/front-web-alferes.git
WORKDIR /usr/src/app/front-web-alferes

RUN npm install 
    
RUN npm install bower -g 
RUN npm install gulp -g 
RUN bower install --allow-root 
    
COPY default.conf /etc/nginx/conf.d/

RUN nginx -g 'daemon off;' & # command 1 blocking
 
CMD ["gulp watch-dev"] # command 2 not executed

Someone know how can I solve this?

Cally answered 23/7, 2019 at 17:18 Comment(5)
Try to concatinate them with a &&Knotty
I tried but not work. :\Cally
Possible duplicate of Running nginx on AlpineSpaak
The usual answer to this question is “in two separate containers”; there’s a standard nginx image that can help you run that part.Pleuropneumonia
@DavidMaze i know the standard is separate in two containers, but in my case doesnt make sense (i dont develop this system, i'm just trying use container). because "gulp watch-dev" is just to manager static file and is not a different service.Cally
C
2

I suggest you try supervisord in this case. http://supervisord.org/

Edit: Here is an dockerized example of httpd and ssh daemon: https://riptutorial.com/docker/example/14132/dockerfile-plus-supervisord-conf

Crocus answered 23/7, 2019 at 20:55 Comment(0)
F
15

Try creating a script like this:

#!/bin/sh
nginx -g 'daemon off;' & 
gulp watch-dev

And then execute it in your CMD:

CMD /bin/my-script.sh

Also, notice your last line would not have worked:

CMD ["gulp watch-dev"]

It needed to be either:

CMD gulp watch-dev

or:

CMD ["gulp", "watch-dev"]

Also, notice that RUN is for executing a command that will change your image state (like RUN apt install curl), not for executing a program that needs to be running when you run your container. From the docs:

The RUN instruction will execute any commands in a new layer on top of the current image and commit the results. The resulting committed image will be used for the next step in the Dockerfile.

Ferrosilicon answered 24/7, 2019 at 5:32 Comment(0)
C
2

I suggest you try supervisord in this case. http://supervisord.org/

Edit: Here is an dockerized example of httpd and ssh daemon: https://riptutorial.com/docker/example/14132/dockerfile-plus-supervisord-conf

Crocus answered 23/7, 2019 at 20:55 Comment(0)
B
1

The answer here is that RUN nginx -g 'daemon off;' is intentionally starting nginx in the foreground, which is blocking your second command. This command is intended to start docker containers with this as the foreground process. Running RUN nginx will start nginx, create the master and child nodes and (hopefully) exit with a zero status code. Although as mentioned above, this is not the intended use of run, so a bash script would work best in this case.

Beadledom answered 29/9, 2019 at 17:13 Comment(0)
T
0

RUN npm install bower -g && \ npm install gulp -g && \ bower install --allow-root

Timeless answered 5/7 at 13:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.