Thông thường để sửa đổi file trong container ta có rất nhiều cách, cách đơn giản nhất là tạo một file ở ngoài máy host, sau đó mount vào container, hoặc có thể exec vào container và sửa file, trong bài viết này sẻ hướng dẫn bạn một cách khác là thay đổi nội dung file thông qua biến môi trường.
Build time trong docker
Build time là quá trình xây dựng image từ dockerfile, những gì được định nghĩa ở giai đoạn này sẽ không thể thay đổi sau khi build.
Run time trong docker
Run time là giai đoạn khởi tạo container, trước khi tạo container sẽ là giai đoạn chuẩn bị bao gồm những việc như giải nén image, chạy các tiến trình…vv , chúng ta sẽ tận dụng giai đoạn này để docker cấu hình file tùy chỉnh của chúng ta thay vì những cách làm ở trên.
soucre của hướng dẫn này được để ở đây, các bạn có thể clone về để thực hành, project này khá đơn giản chỉ gồm một file html và dùng nginx để host file này, sau khi build và start container,
Run project
Sau khi clone về, bạn mở thư mục lên bằng vs code , sau đó mở terminal(nếu dùng mac hoặc linux). Vào thư mục docker > _ , sau đó kéo thả file build.sh vào terminal và nhấn enter.
File script này sẻ build docker image, sau khi build xong làm tương tự đối với file run.sh
bạn truy cập vào localhost:8080, mặc định trang web sẻ hiển thị như thế này.
Đổi màu nền cho web
Để đổi màu nền cho web bạn thay đổi mã màu (html color code) trong file .env
IMAGE_TAG='nginx-backgroundweb' CONTAINER_NAME='nginx-backgroundweb-c' PORT=8080 DOCKER_NETWORK='nginx-backgroundweb-n' # env.runtime for index.html VAR_COLOR=06FCE6
đổi VAR_COLOR=06FCE6 thành VAR_COLOR=#FF5733 , chạy lại file run.sh và kiểm tra kết qủa.
Khá là hay đúng không nào 🙂
Cách hoạt động
Trong thư mục của bạn clone về có một file là index.tpl.html, file này là file html có chứa một biến ($VAR_COLOR)
<style> body { background-color: $VAR_COLOR; /*background-color: coral;*/ /*background-color: #0c88b4;*/ /*background-color: rgba(0,122,333, .5);*/ } </style> <body data-rsssl=1> <div>This is web app with customize-able background color</div> </body>
khi khởi động container lên thì giá trị của biến sẻ được nạp vào từ môi trường của container thông qua một script:
#!/usr/bin/env bash env | grep -c "VAR_COLOR" # check env exist [ $? = 1 ] && (echo 'Envvar $VAR_COLOR is required, please fill via prama -e into docker run'; kill $$) echo $VAR_COLOR && envsubst '$VAR_COLOR' < ./index.tpl.html > ./index.html && \ cp ./index.html /usr/share/nginx/html && \ cat /usr/share/nginx/html/index.html && \ nginx -g 'daemon off;'
giải thích sơ về file này là nó sẻ dùng lệnh envsubst lấy mã màu từ môi trường và nạp vào biến $VAR_COLOR sau đó ghi thành file mới với tên là index.html sau đó cpy vào thư mục /usr/share/nginx/html.
Dockerfile
Copy nhưng file cần thiết vào container và dùng CMD để chạy script.
FROM nginx WORKDIR /app # =create index.html from index.tpl.html with param $VAR_COLOR from envvar COPY envsubst.sh . COPY index.tpl.html . CMD ./envsubst.sh