Halo, kalau kamu merasa tulisan saya ngebantu kamu, kamu bisa ucapkan terima kasih lewat saweria.

Hello, if you find this article helpful, you can express your gratitude through saweria.



Awalan

Bagi yang sering menggunakan docker-compose, sudah familiar dengan opsi environment, kita coba lihat dari Shlink

name: service-contoh
services:
    service-contoh:
        .
        .
        .
        #kita akan belajar custom bagian ini
        environment:
            - DB_DRIVER=${DB_DRIVER}
            - DB_USER=${DB_USER}
            - DB_PASSWORD=${DB_PASSWORD}
            - DB_HOST=${DB_HOST}
            - DB_NAME=${DB_NAME}
        #dengan yg lebih simpel tentunya
          .
          .
          .

Menggunakan sed

  1. Siapkan beberapa file .env, docker-compose.yml, Dockerfile, entrypoint.sh, index.html & nginx.conf

  2. File index.html

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        Selamat datang di {URL}
    </body>
</html>
  1. nginx.conf
worker_processes 1;
error_log stderr warn;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;

    # Define custom log format to include reponse times
   # log_format main_timed '$remote_addr - $remote_user [$time_local] "$request" '
 #                         '$status $body_bytes_sent "$http_referer" '
  #                        '"$http_user_agent" "$http_x_forwarded_for" '
   #                       '$request_time $upstream_response_time $pipe $upstream_cache_status';

    access_log off;
    error_log off;

    # allow the server to close connection on non responding client, this will free up memory
    reset_timedout_connection on;

    # request timed out -- default 60
    client_body_timeout 10;

    # if client stop responding, free up memory -- default 60
    send_timeout 2;

    # server will close connection after this time -- default 75
    keepalive_timeout 30;

    # number of requests client can make over keep-alive -- for testing environment
    keepalive_requests 100000;

    # Write temporary files to /tmp so they can be created as a non-privileged user
    client_body_temp_path /tmp/client_temp;
    proxy_temp_path /tmp/proxy_temp_path;
    fastcgi_temp_path /tmp/fastcgi_temp;
    uwsgi_temp_path /tmp/uwsgi_temp;
    scgi_temp_path /tmp/scgi_temp;

    # Default server definition
    server {
        #please use uncommon port
        listen [::]:80 default_server;
        listen 80 default_server;
        server_name _;
        server_tokens off;
        sendfile off;
        root /var/www/html;

        location / {
            index index.html;
        }


    }

    gzip on;
    gzip_proxied any;
    gzip_types text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss font/truetype font/opentype;
    gzip_vary on;
    gzip_disable "msie6";

    # Include other server configs
    include /etc/nginx/conf.d/*.conf;
}
  1. entrypoint.sh
#!/bin/bash

find /var/www/html -type f -name "*.html" -exec sed -i -e "s|{URL}|URL|g" {} \;

nginx -g "daemon off;"
  1. Dockerfile
FROM nginx:alpine

# Install tzdata and remove default.conf
RUN apk --no-cache add tzdata && \
    rm /etc/nginx/conf.d/default.conf

WORKDIR /var/www/html

# Set timezone to Asia/Jakarta
RUN cp /usr/share/zoneinfo/Asia/Jakarta /etc/localtime && \
    echo "Asia/Jakarta" > /etc/timezone

# Copy custom nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf

# Create document root directory
RUN mkdir -p /var/www/html

# Copy application files
COPY . /var/www/html/

# Set ownership of document root
RUN chown -R nginx:nginx /var/www/html

EXPOSE 8080

COPY entrypoint.sh /var/www/html/entrypoint.sh
RUN chmod +x /var/www/html/entrypoint.sh

ENTRYPOINT [ "sh", "/var/www/html/entrypoint.sh" ]
CMD []
  1. docker-compose.yml
name: env-custom-test

services:
  env-custom-test:
    image: docker.io/library/env-custom-test-image:latest
    container_name: env-custom-test-ctr
    restart: always
    ports:
      - 88:80
    env_file:
      - .env
    environment:
      - URL=${URL}
    networks:
      - env-custom-test-net

networks:
  env-custom-test-net:
  1. File .env
URL=ipang.my.id
  1. Build image dengan docker build -t env-custom-test-image:latest .

  2. Jalankan docker compose up -d

  3. Coba ganti value di .env untuk bereksperimen


Menggunakan envsubst

  1. Siapkan beberapa file .env, docker-compose.yml, Dockerfile, entrypoint.sh, index.html & nginx.conf

  2. File index.html

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        Selamat datang di $URL
    </body>
</html>
  1. nginx.conf
worker_processes 1;
error_log stderr warn;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/octet-stream;

    # Define custom log format to include reponse times
   # log_format main_timed '$remote_addr - $remote_user [$time_local] "$request" '
 #                         '$status $body_bytes_sent "$http_referer" '
  #                        '"$http_user_agent" "$http_x_forwarded_for" '
   #                       '$request_time $upstream_response_time $pipe $upstream_cache_status';

    access_log off;
    error_log off;

    # allow the server to close connection on non responding client, this will free up memory
    reset_timedout_connection on;

    # request timed out -- default 60
    client_body_timeout 10;

    # if client stop responding, free up memory -- default 60
    send_timeout 2;

    # server will close connection after this time -- default 75
    keepalive_timeout 30;

    # number of requests client can make over keep-alive -- for testing environment
    keepalive_requests 100000;

    # Write temporary files to /tmp so they can be created as a non-privileged user
    client_body_temp_path /tmp/client_temp;
    proxy_temp_path /tmp/proxy_temp_path;
    fastcgi_temp_path /tmp/fastcgi_temp;
    uwsgi_temp_path /tmp/uwsgi_temp;
    scgi_temp_path /tmp/scgi_temp;

    # Default server definition
    server {
        #please use uncommon port
        listen [::]:80 default_server;
        listen 80 default_server;
        server_name _;
        server_tokens off;
        sendfile off;
        root /var/www/html;

        location / {
            index index.html;
        }


    }

    gzip on;
    gzip_proxied any;
    gzip_types text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss font/truetype font/opentype;
    gzip_vary on;
    gzip_disable "msie6";

    # Include other server configs
    include /etc/nginx/conf.d/*.conf;
}
  1. entrypoint.sh
#!/bin/bash

#envsubst cannot override original file
envsubst < "index.html" > "index.html.temp"

mv index.html.temp index.html

nginx -g "daemon off;
  1. Dockerfile
FROM nginx:alpine

# Install tzdata and remove default.conf
RUN apk --no-cache add tzdata && \
    rm /etc/nginx/conf.d/default.conf

WORKDIR /var/www/html

# Set timezone to Asia/Jakarta
RUN cp /usr/share/zoneinfo/Asia/Jakarta /etc/localtime && \
    echo "Asia/Jakarta" > /etc/timezone

# Copy custom nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf

# Create document root directory
RUN mkdir -p /var/www/html

# Copy application files
COPY . /var/www/html/

# Set ownership of document root
RUN chown -R nginx:nginx /var/www/html

EXPOSE 8080

COPY entrypoint.sh /var/www/html/entrypoint.sh
RUN chmod +x /var/www/html/entrypoint.sh

ENTRYPOINT [ "sh", "/var/www/html/entrypoint.sh" ]
CMD []
  1. docker-compose.yml
name: envsubst-custom-test

services:
  envsubst-custom-test:
    image: docker.io/library/envsubst-custom-test-image:latest
    container_name: envsubst-custom-test-ctr
    restart: always
    ports:
      - 888:80
    env_file:
      - .env
    environment:
      - URL=${URL}
    networks:
      - envsubst-custom-test-net

networks:
  envsubst-custom-test-net:
  1. File .env
URL=ipang.my.id
  1. Build image dengan docker build -t envsubst-custom-test-image:latest . --no-cache

  2. Jalankan docker compose up -d

  3. Coba ganti value di .env untuk bereksperimen