{"id":23591,"date":"2025-07-12T05:34:08","date_gmt":"2025-07-12T05:34:08","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=23591"},"modified":"2025-07-12T05:38:37","modified_gmt":"2025-07-12T05:38:37","slug":"understanding-dockerfiles-instructions-options-of-docker","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/understanding-dockerfiles-instructions-options-of-docker\/","title":{"rendered":"Docker Tutorials: Docker Image &#8211; Understanding Dockerfiles instructions &amp; options"},"content":{"rendered":"\n<p>Here\u2019s a <strong>step-by-step tutorial for Dockerfile<\/strong>, including explanations and examples for each major command.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Dockerfile Tutorial<\/h1>\n\n\n\n<p>A <strong>Dockerfile<\/strong> is a text file containing instructions to build a Docker image. Each instruction creates a new layer in the image. Below are the most commonly used Dockerfile commands, their descriptions, and usage examples.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. <code>FROM<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Specifies the base image to use. This must be the first command in the Dockerfile.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">FROM<\/span> <span class=\"hljs-selector-tag\">ubuntu<\/span><span class=\"hljs-selector-pseudo\">:22.04<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This starts your build from the official Ubuntu 22.04 image.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. <code>MAINTAINER<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Optionally defines the author or maintainer of the image (deprecated in favor of LABEL).<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">MAINTAINER Rajesh Kumar <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">rajesh@example.com<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Modern alternative:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">LABEL maintainer=\"Rajesh Kumar <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">rajesh@example.com<\/span>&gt;<\/span>\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. <code>ADD<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Copies files\/directories from the host into the image. Can also extract local tar archives.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ADD myapp.tar.gz \/opt\/\nADD config\/settings.json \/etc\/myapp\/\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. <code>COPY<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>(Copy is very similar to ADD but doesn\u2019t do auto-extraction or remote URLs; prefer COPY unless you need ADD features.)<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">COPY . \/app\/\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. <code>RUN<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Executes commands in a new layer during build, e.g., install packages.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">RUN apt-<span class=\"hljs-keyword\">get<\/span> update &amp;&amp; apt-<span class=\"hljs-keyword\">get<\/span> install -y nginx\nRUN mkdir \/app\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. <code>CMD<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Sets the default command to run when a container is started from the image (can be overridden).<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">CMD<\/span> <span class=\"hljs-selector-attr\">&#091;<span class=\"hljs-string\">\"nginx\"<\/span>, <span class=\"hljs-string\">\"-g\"<\/span>, <span class=\"hljs-string\">\"daemon off;\"<\/span>]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. <code>ENTRYPOINT<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Sets a command that will always run (even if arguments are passed to <code>docker run<\/code>).<br>Allows for combining with CMD for default args.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ENTRYPOINT<\/span> <span class=\"hljs-selector-attr\">&#091;<span class=\"hljs-string\">\"python3\"<\/span>, <span class=\"hljs-string\">\"app.py\"<\/span>]<\/span>\n<span class=\"hljs-selector-tag\">CMD<\/span> <span class=\"hljs-selector-attr\">&#091;<span class=\"hljs-string\">\"--help\"<\/span>]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. <code>ENV<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Sets environment variables in the image.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ENV APP_ENV=production\nENV PATH=<span class=\"hljs-string\">\"\/opt\/myapp\/bin:${PATH}\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. <code>EXPOSE<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Documents which port(s) the app inside the container uses (does not actually publish the port).<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">EXPOSE 80\nEXPOSE 443\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. <code>USER<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Sets the default user to run commands as in the image.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">USER www-data\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11. <code>VOLUME<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Defines a mount point for external volumes or persistent data.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">VOLUME<\/span> <span class=\"hljs-selector-attr\">&#091;<span class=\"hljs-string\">\"\/data\"<\/span>]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12. <code>WORKDIR<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Sets the working directory for RUN, CMD, ENTRYPOINT, COPY, and ADD.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">WORKDIR \/app\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13. <code>ONBUILD<\/code><\/h2>\n\n\n\n<p><strong>Description<\/strong>:<br>Adds a trigger instruction to be executed when the image is used as the base for another build.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ONBUILD COPY . \/app\/src\n<\/code><\/span><\/pre>\n\n\n<p>Useful for images intended to be used as parent images (like language or framework base images).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Example: Complete Dockerfile<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">FROM python:<span class=\"hljs-number\">3.11<\/span>-slim\nLABEL maintainer=<span class=\"hljs-string\">\"Rajesh Kumar &lt;rajesh@example.com&gt;\"<\/span>\n\nWORKDIR \/app\n\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\n\nCOPY . .\n\nENV FLASK_ENV=production\n\nEXPOSE <span class=\"hljs-number\">5000<\/span>\n\nCMD &#091;<span class=\"hljs-string\">\"python\"<\/span>, <span class=\"hljs-string\">\"app.py\"<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">How to Build &amp; Run<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Build the image:<\/strong> <code>docker build -t my-flask-app .<\/code><\/li>\n\n\n\n<li><strong>Run the container:<\/strong> <code>docker run -p 5000:5000 my-flask-app<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Quick Reference Table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>FROM<\/td><td>Sets base image (first line)<\/td><\/tr><tr><td>MAINTAINER<\/td><td>Maintainer info (deprecated, use LABEL)<\/td><\/tr><tr><td>LABEL<\/td><td>Set metadata info<\/td><\/tr><tr><td>ADD<\/td><td>Copy files\/dirs &amp; extract archives<\/td><\/tr><tr><td>COPY<\/td><td>Copy files\/dirs (no extract)<\/td><\/tr><tr><td>RUN<\/td><td>Execute commands at build time<\/td><\/tr><tr><td>CMD<\/td><td>Default command at container start<\/td><\/tr><tr><td>ENTRYPOINT<\/td><td>Main entry command (always runs)<\/td><\/tr><tr><td>ENV<\/td><td>Set environment variables<\/td><\/tr><tr><td>EXPOSE<\/td><td>Declare ports to be exposed<\/td><\/tr><tr><td>USER<\/td><td>Set default user<\/td><\/tr><tr><td>VOLUME<\/td><td>Define mount point for volumes<\/td><\/tr><tr><td>WORKDIR<\/td><td>Set default working directory<\/td><\/tr><tr><td>ONBUILD<\/td><td>Add trigger instructions for child builds<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <code>FROM<\/code> as the first command.<\/li>\n\n\n\n<li>Use <code>COPY<\/code> for simple file copy, <code>ADD<\/code> if you need to extract archives.<\/li>\n\n\n\n<li>Use <code>RUN<\/code> for installing dependencies or system setup.<\/li>\n\n\n\n<li>Use <code>WORKDIR<\/code> to organize working directories.<\/li>\n\n\n\n<li>Use <code>CMD<\/code> or <code>ENTRYPOINT<\/code> for startup commands.<\/li>\n\n\n\n<li>Use <code>ENV<\/code>, <code>EXPOSE<\/code>, <code>USER<\/code>, <code>VOLUME<\/code> as needed for best practices.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n\n<p>Absolutely! Here\u2019s a <strong>beginner-friendly Dockerfile using the Ubuntu image<\/strong>, demonstrating all key Dockerfile instructions. This example will <strong>build and run successfully<\/strong>. It will output a simple message showing which instructions were used and that everything works.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Directory Structure<\/strong><\/h2>\n\n\n\n<p>Put these two files in your build directory:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">.\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">Dockerfile<\/span>\n\u251c\u2500\u2500 <span class=\"hljs-selector-tag\">hello<\/span><span class=\"hljs-selector-class\">.txt<\/span>\n\u2514\u2500\u2500 <span class=\"hljs-selector-tag\">script<\/span><span class=\"hljs-selector-class\">.sh<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><code>hello.txt<\/code> \u2013 a simple text file (<code>echo \"Hello, this is a demo file.\" &gt; hello.txt<\/code>)<\/li>\n\n\n\n<li><code>script.sh<\/code> \u2013 a script to show everything works: <code>#!\/bin\/bash echo \"======== Script Running ========\" echo \"Hello from inside the container!\" echo \"This file was copied using COPY.\" echo \"Argument to script: $1\" echo \"APP_HOME is set to: $APP_HOME\" echo \"Now displaying contents of \/opt\/demoapp\/hello.txt:\" cat \/opt\/demoapp\/hello.txt echo \"Listing the shared volume directory:\" ls \/opt\/demoapp\/data echo \"======== End of Script ========\"<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Make script executable:<\/strong><br><code>chmod +x script.sh<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dockerfile (All Instructions Used, Clean &amp; Ready for Students)<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># 1. FROM - Always first<\/span>\nFROM ubuntu:<span class=\"hljs-number\">22.04<\/span>\n\n<span class=\"hljs-comment\"># 2. LABEL (modern replacement for MAINTAINER)<\/span>\nLABEL maintainer=<span class=\"hljs-string\">\"Student &lt;student@example.com&gt;\"<\/span>\n\n<span class=\"hljs-comment\"># 3. ENV - Set environment variables<\/span>\nENV APP_HOME=\/opt\/demoapp \\\n    APP_ENV=development\n\n<span class=\"hljs-comment\"># 4. ADD - Add a file (could be used for local archives too)<\/span>\nADD hello.txt \/opt\/demoapp\/hello.txt\n\n<span class=\"hljs-comment\"># 5. COPY - Copy your script into the container<\/span>\nCOPY script.sh \/opt\/demoapp\/script.sh\n\n<span class=\"hljs-comment\"># 6. RUN - Install a package and prepare directories<\/span>\nRUN apt-get update &amp;&amp; \\\n    apt-get install -y tree &amp;&amp; \\\n    mkdir -p \/opt\/demoapp\/data\n\n<span class=\"hljs-comment\"># 7. WORKDIR - Set the working directory<\/span>\nWORKDIR \/opt\/demoapp\n\n<span class=\"hljs-comment\"># 8. VOLUME - Create a mount point for data (persists data outside container)<\/span>\nVOLUME &#091;<span class=\"hljs-string\">\"\/opt\/demoapp\/data\"<\/span>]\n\n<span class=\"hljs-comment\"># 9. EXPOSE - Document the port (not used by this demo, but included)<\/span>\nEXPOSE <span class=\"hljs-number\">8080<\/span>\n\n<span class=\"hljs-comment\"># 10. USER - Create and switch to a non-root user (safer for students)<\/span>\nRUN useradd -ms \/bin\/bash studentuser\nUSER studentuser\n\n<span class=\"hljs-comment\"># 11. ENTRYPOINT - Script that always runs<\/span>\nENTRYPOINT &#091;<span class=\"hljs-string\">\"\/bin\/bash\"<\/span>, <span class=\"hljs-string\">\"\/opt\/demoapp\/script.sh\"<\/span>]\n\n<span class=\"hljs-comment\"># 12. CMD - Default argument to the script<\/span>\nCMD &#091;<span class=\"hljs-string\">\"from-cmd\"<\/span>]\n\n<span class=\"hljs-comment\"># 13. ONBUILD - Will only trigger if this image is used as a base in another Dockerfile<\/span>\nONBUILD RUN <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"This message runs only if someone builds FROM this image!\"<\/span>\n\n<span class=\"hljs-comment\"># END OF DOCKERFILE<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to Build and Run<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Make sure script.sh is executable<\/span>\nchmod +x script.sh\n\n<span class=\"hljs-comment\"># Build the image (from the directory containing Dockerfile, script.sh, hello.txt)<\/span>\ndocker build -t ubuntu-dockerfile-demo .\n\n<span class=\"hljs-comment\"># Run the container<\/span>\ndocker run --rm -v $(pwd)\/shared:\/opt\/demoapp\/data ubuntu-dockerfile-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>This will output the script message, read the file added with <code>ADD<\/code>, show the shared volume, and display all environment variable usage.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What Students Learn<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How to use each main Dockerfile instruction<\/li>\n\n\n\n<li>How to create a non-root user for better practice<\/li>\n\n\n\n<li>How to mount a volume and see files persist<\/li>\n\n\n\n<li>How to pass and use environment variables<\/li>\n\n\n\n<li>How to run a script with CMD arguments<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Reference<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/example-and-sample-programs-of-dockerfile\/\">https:\/\/www.devopsschool.com\/blog\/example-and-sample-programs-of-dockerfile\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/understanding-dockerfiles-instructions-options-of-docker\/\">https:\/\/www.devopsschool.com\/blog\/understanding-dockerfiles-instructions-options-of-docker\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/dockerfile-lab-exercise-1\/\">https:\/\/www.devopsschool.com\/blog\/dockerfile-lab-exercise-1\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.devopsschool.com\/blog\/how-to-create-a-image-using-dockerfile\/\">https:\/\/www.devopsschool.com\/blog\/how-to-create-a-image-using-dockerfile\/<\/a><\/li>\n<\/ul>\n\n\n\n<div class=\"epyt-gallery\" data-currpage=\"1\" id=\"epyt_gallery_86868\"><iframe loading=\"lazy\"  id=\"_ytid_70712\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/?enablejsapi=1&autoplay=0&cc_load_policy=0&cc_lang_pref=&iv_load_policy=1&loop=0&rel=1&fs=1&playsinline=0&autohide=2&theme=dark&color=red&controls=1&disablekb=0&\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  data-epytgalleryid=\"epyt_gallery_86868\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe><div class=\"epyt-gallery-list\"><div>Sorry, there was a YouTube error.<\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a step-by-step tutorial for Dockerfile, including explanations and examples for each major command. Dockerfile Tutorial A Dockerfile is a text file containing instructions to build a Docker image. Each&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4862],"tags":[],"class_list":["post-23591","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=23591"}],"version-history":[{"count":5,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23591\/revisions"}],"predecessor-version":[{"id":50120,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/23591\/revisions\/50120"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=23591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=23591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=23591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}