Home > OS >  What does "sh -c" do?
What does "sh -c" do?

Time:11-13

I am trying to work with nginx in my express app and I'm following the tutorial here

https://cloud.google.com/community/tutorials/deploy-react-nginx-cloud-run

then at the end I saw this command

CMD sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

Please what does the above command do?

Most specifically what does "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" do?

Also, how do I run another command after that command above, because it seems I can't have multiple CMD statements. I need to run the below after that last command

CMD["node","server.js"]

CodePudding user response:

The purpose of sh -c here is already precisely to run multiple commands in one statement. The string after -c can contain an arbitrary number of commands, separated by command separators. Just add more, as many as you like.

CMD sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;' && node server.js"

At some point, as the command line grows more complex, it makes more senso to put the commands in a file, COPY it into the container, and then simply put that file as your CMD. You can also create it within your Dockerfile;

RUN printf '%s\n' >cmd.sh \
    "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf &&" \
    "nginx -g 'daemon off;' &&" \
    "node server.js"
# ...
CMD ["sh", "cmd.sh"]

As for what these commands do,

envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf

generates /etc/nginx/conf.d/default.conf from the template file /etc/nginx/conf.d/configfile.temp by running the envsubst command; see its manual page for details. (The backslash before the dollar sign in $PORT isn't really part of the command; it's required because the enclosing string is interpreted by Docker, which has its own variable substitution mechanism, which would replace the value at build time if the dollar sign wasn't escaped; we don't want that here.)

&&

is a command separator which says to only proceed if the previous command succeeded. In other words, a && b runs a, and b if a didn't fail. (Success or failure is determined by examining the exit code from a, which is also momentarily available in the shell variable $? until you run another external command.)

nginx -g 'daemon off;'

runs nginx with the string as the argument to the -g option. Again, refer to the man page for details.

CodePudding user response:

sh -c just means you are giving your shell (sh) a commande to execute as parameter. In your case, it would be 'like' typing in a terminal on the docker instance envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;' ` This line set the nginx config of your container.

to run node from your docker instance, use

RUN node server.js

I recommand this quick read on Docker run and cmd command : https://www.geeksforgeeks.org/difference-between-run-vs-cmd-vs-entrypoint-docker-commands/

  • Related