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/
