Trong bài viết trước mình đã giới thiệu cách thay đổi nội dung file thông qua biến môi trường trong docker, nếu bạn chưa đọc có thể ghé qua tại đây
Trong bài viết này, mình xin chia sẻ một cách làm khác đó là dùng volume và init container, đây làm một kĩ thuật phổ biến ở K8s.
Init container là một dạng container được khởi chạy lên trước container chín, nó sẻ khởi tạo data cần thiết đẻ container chín có thể hoạt động. ví dụ bạn cần tạo một container database với một vài table đươc tạo sẳn, thì bạn cần tạo volume, dùng init container để đưa data vào volume, sau đó mount vào container database.
Docker-compose
mình sẻ sử dụng docker-compose đẻ khởi chạy
Init container
Init container là một dạng container được khởi chạy lên trước container chín, nó sẻ khởi tạo data cần thiết đẻ container chín có thể hoạt động. ví dụ bạn cần tạo một container database với một vài table đươc tạo sẳn, thì bạn cần tạo volume, dùng init container để đưa data vào volume, sau đó mount vào container database.
Docker-compose
mình sẻ sử dụng docker-compose đẻ khởi chạy
version: "3.4"
services:
init:
image: bash
container_name: init
command: bash -c "echo 123 > /home/test.txt"
volumes:
- init-data:/home
Mình sẻ dùng `command: bash -c “echo 123 > /home/test.txt”` để tạo file cần cho container chín sử dụng. File này mình sẽ được lưu vào volume init-data.
...
main:
image: busybox
container_name: main
command: ["tail", "-f", "/dev/null"]
volumes:
- init-data:/home
giả sử mình dùng một container main để sử dụng data đươc tạo ra từ init container.
docker-compose hoàn chỉn sẽ như thế này.
version: "3.4"
services:
init:
image: bash
container_name: init
command: bash -c "echo 123 > /home/test.txt"
volumes:
- init-data:/home
main:
image: busybox
container_name: main
command: ["tail", "-f", "/dev/null"]
volumes:
- init-data:/home
volumes:
init-data: {}
Tạo nhiều file cùng lúc, hoặc file nhiều dòng
Để tạo nhiều file cũng lúc hoặc file nhiều dòng bạn làm như sau
version: "3.4"
services:
init:
image: bash
container_name: init
command:
- bash
- -c
- |
cat < /home/file1.txt
rule_files:
- "/alertmanager/alert.rules"
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
scrape_timeout: 2s
honor_labels: true
static_configs:
- targets: ['prometheus:9090']
static_configs:
- targets: ['cadvisor:8080']
EOT
cat < /home/file2.txt
rule_files:
- "/alertmanager/alert.rules"
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
scrape_timeout: 2s
honor_labels: true
EOT
volumes:
- exp-data:/home
main:
image: busybox
container_name: main
command: ["tail", "-f", "/dev/null"]
volumes:
- exp-data:/home
volumes:
exp-data: {}
Depends_on
Để cho container chín luôn chạy đúng, hoặc tránh lỗi file không tìm thấy, bạn cần đảm bảo rằng container init luôn động trước và container main sẻ khởi động lên sau.
...
depends_on:
init:
condition: service_started