Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Azure Container Apps dapat menjalankan aplikasi JavaScript dalam kontainer apa pun di cloud sambil memberikan opsi fleksibel tentang cara Anda menyebarkan aplikasi Anda.
Konfigurasi
Azure Container Apps memungkinkan Anda untuk menyederhanakan penyebaran aplikasi JavaScript Anda melalui kontainerisasi yang efektif termasuk menyiapkan variabel lingkungan, merancang Dockerfiles yang efisien, dan mengatur proses build aplikasi Anda.
Variabel Lingkungan
Variabel lingkungan sangat penting untuk mengonfigurasi aplikasi Anda.
.env Gunakan file untuk mengelola variabel ini secara lokal dan pastikan variabel dikelola dengan aman dalam produksi dengan layanan seperti Azure Key Vault.
Contoh berikut menunjukkan cara membuat variabel untuk aplikasi Anda.
# .env
NODE_ENV=production
PORT=3000
AZURE_COSMOS_DB_ENDPOINT=https://<YOUR_COSMOSDB_RESOURCE_NAME>.documents.azure.com:443/
Kontainer
Dockerfile yang dikonfigurasi dengan baik sangat penting untuk kontainerisasi aplikasi Anda:
Gunakan Dockerfile dasar: Jika beberapa proyek berbagi penyiapan umum, Anda dapat membuat Dockerfile dasar yang menyertakan langkah-langkah umum ini. Dockerfile setiap proyek kemudian dapat dimulai dengan
FROMgambar dasar ini dan menambahkan konfigurasi khusus proyek.Parameterisasi argumen build: Anda dapat menggunakan argumen build (
ARG) di Dockerfile Anda untuk membuatnya lebih fleksibel. Dengan cara ini, Anda dapat meneruskan nilai yang berbeda untuk argumen ini saat membangun untuk pengembangan, penahapan, atau produksi.Gambar dasar Node.js yang dioptimalkan: Pastikan Anda menggunakan gambar dasarNode.js yang sesuai. Pertimbangkan untuk menggunakan gambar yang lebih kecil dan dioptimalkan seperti varian Alpine untuk mengurangi overhead.
File Minimal - Salin Hanya Esensial: Fokus pada penyalinan hanya file yang diperlukan ke dalam kontainer Anda. Buat
.dockerignorefile untuk memastikan file pengembangan tidak disalin seperti.envdannode_modules. File ini membantu mempercepat proses build dalam kasus di mana pengembang menyalin file yang tidak perlu.Memisahkan build dan runtime dengan build multi-tahap: Gunakanlah build multi-tahap untuk membuat citra akhir yang ringan dengan memisahkan lingkungan build dari runtime.
Artefak bawaan dengan mengkompilasi dan menggabungkan: Membangun artefak aplikasi Anda sebelumnya (seperti mengkompilasi TypeScript atau menggabungkan JavaScript) sebelum menyalinnya ke tahap runtime dapat meminimalkan ukuran gambar, mempercepat penyebaran kontainer, dan meningkatkan performa cold start. Urutan instruksi yang cermat di Dockerfile Anda juga dapat mengoptimalkan proses caching dan waktu pembangunan ulang.
Docker Compose untuk lingkungan pengembangan: Docker Compose memungkinkan Anda menentukan dan menjalankan aplikasi Docker multi-kontainer. Pendekatan multi-kontainer ini berguna untuk menyiapkan lingkungan pengembangan. Anda dapat menyertakan konteks build dan Dockerfile dalam file compose. Tingkat enkapsulasi ini memungkinkan Anda menggunakan Dockerfiles yang berbeda untuk layanan yang berbeda jika diperlukan.
Dockerfile Dasar
File ini berfungsi sebagai titik awal umum untuk gambar Node.js Anda. Anda dapat menggunakannya dengan FROM direktif di Dockerfiles yang mereferensikan gambar dasar ini. Gunakan nomor versi atau commit untuk mendukung versi gambar terbaru dan aman.
# Dockerfile.base
FROM node:22-alpine
# Set the working directory
WORKDIR /usr/src/app
# Define build arguments with default values
ARG PORT_DEFAULT=3000
ARG ENABLE_DEBUG_DEFAULT=false
# Set environment variables using the build arguments
ENV PORT=${PORT_DEFAULT}
ENV ENABLE_DEBUG=${ENABLE_DEBUG_DEFAULT}
# Copy package manifests and install dependencies
COPY package*.json ./
RUN npm install
# Expose the application and debugging ports
EXPOSE $PORT
EXPOSE 9229
# This image focuses on common steps; project-specific Dockerfiles can extend this.
Saat Anda meneruskan nilai menggunakan --build-arg parameter selama proses build, nilai yang diteruskan akan menggantikan nilai default yang dipatok di Dockerfile Anda.
Contohnya:
docker build \
--build-arg PORT_DEFAULT=4000 \
--build-arg ENABLE_DEBUG_DEFAULT=true \
--tag <IMAGE>:<TAG> \
--file Dockerfile.base .
Dalam contoh ini, variabel PORT lingkungan dan ENABLE_DEBUG diatur ke nilai eksplisit, bukan nilai defaultnya.
Konvensi pemberian tag gambar kontainer seperti penggunaan latest adalah konvensi. Pelajari selengkapnya tentang rekomendasi untuk memberi tag dan membuat versi gambar kontainer.
Menyiapkan lingkungan pengembangan dengan Docker Compose
Contoh konfigurasi berikut menggunakan Dockerfile pengembangan khusus (Dockerfile.dev) bersama dengan pemasangan volume untuk pemuatan ulang langsung dan sinkronisasi sumber lokal.
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile.base
args:
PORT_DEFAULT: ${PORT:-3000}
ENABLE_DEBUG_DEFAULT: ${ENABLE_DEBUG:-false}
ports:
- "${PORT:-3000}:3000"
- "9229:9229" # Expose debug port if needed
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
environment:
- NODE_ENV=development
- PORT=${PORT:-3000}
- ENABLE_DEBUG=${ENABLE_DEBUG:-false}
Untuk memulai Docker Compose dengan nilai kustom, Anda dapat mengekspor variabel lingkungan pada baris perintah. Contohnya:
PORT=4000 ENABLE_DEBUG=true docker compose up
Dockerfile Produksi
Dockerfile multi-tahap ini membangun aplikasi Anda dan menghasilkan runtime image yang ramping. Pastikan file .dockerignore Anda sudah ada di kode sumber agar perintah COPY . . tidak menyalin file-file yang khusus untuk lingkungan pengembangan dan tidak diperlukan dalam produksi.
# Stage 1: Builder
FROM node:22 AS build
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
# Build your project (e.g., compile TypeScript or bundle JavaScript)
RUN npm run build
# Stage 2: Runtime
FROM my-base-image:latest AS runtime
WORKDIR /usr/src/app
# Copy only the compiled output and essential files from the build stage
COPY --from=build /usr/src/app/dist ./dist
COPY --from=build /usr/src/app/package*.json ./
# Install only production dependencies
RUN npm ci --omit=dev
# Copy the entrypoint script for remote debugging
COPY entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# Expose the application port (using the PORT environment variable) and the debug port (9229)
EXPOSE $PORT
EXPOSE 9229
# Use the entrypoint script to conditionally enable debugging
ENTRYPOINT ["sh", "/usr/src/app/entrypoint.sh"]
Skrip masuk memungkinkan Anda terhubung ke aplikasi kontainer Anda untuk debug jarak jauh.
Untuk menjalankan kontainer dari gambar produksi bawaan dengan variabel lingkungan kustom, jalankan:
docker run \
--env PORT=4000 \
--env ENABLE_DEBUG=true \
--publish 4000:4000 \
--publish 9229:9229 \
<IMAGE>:<TAG>
Untuk build produksi, pastikan Anda menggunakan tag versi yang benar, yang mungkin bukan latest. Konvensi pemberian tag gambar kontainer seperti penggunaan latest adalah konvensi. Pelajari selengkapnya tentang rekomendasi untuk memberi tag dan membuat versi gambar kontainer.
Penyebaran
Untuk mendukung integrasi berkelanjutan/penyebaran berkelanjutan (CI/CD), siapkan alur CI/CD menggunakan GitHub Actions, Azure DevOps, atau alat CI/CD lain untuk mengotomatiskan proses penyebaran.
# .github/workflows/deploy.yml
name: Deploy to Azure
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Install dependencies
run: npm ci
- name: Build the app
run: npm run build
- name: Log in to Azure
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Container Apps
run: |
az containerapp up \
--name my-container-app \
--resource-group my-resource-group \
--image my-image:my_tag \
--environment my-environment \
--cpu 1 --memory 2Gi \
--env-vars NODE_ENV=production PORT=3000
Saat Anda menggunakan Docker Registry, masuk ke registri Anda lalu dorong gambar Docker Anda ke registri kontainer seperti Azure Container Registry (ACR) atau Docker Hub.
# Tag the image
docker tag \
<IMAGE>:<TAG> \
<AZURE_REGISTRY>.azurecr.io/<IMAGE>:<TAG>
# Push the image
docker push <AZURE_REGISTRY>.azurecr.io/<IMAGE>:<TAG>
Awal dingin
Optimalkan build produksi Anda dengan hanya menyertakan kode dan dependensi penting. Untuk memastikan payload Anda seefisien mungkin, gunakan salah satu dari pendekatan berikut:
Build atau bundling Docker multi-tahap: Gunakan alat build dan bundling seperti Webpack atau Rollup untuk membantu Anda membuat payload sekecil mungkin untuk kontainer Docker Anda. Ketika Anda mengkompilasi dan menggabungkan hanya apa yang diperlukan untuk produksi, Anda membantu meminimalkan ukuran kontainer Anda dan membantu dalam meningkatkan waktu mulai dingin.
Kelola dependensi dengan hati-hati: Biarkan folder Anda
node_modulestetap ramping dengan menyertakan hanya paket yang diperlukan untuk menjalankan kode produksi. Jangan mencantumkan dependensi pengembangan atau pengujian di bagiandependenciespackage.jsonAnda. Hapus dependensi yang tidak digunakan dan pastikan filepackage.jsonAnda serta file kunci tetap konsisten.
Keamanan
Pertimbangan keamanan untuk pengembang JavaScript yang menggunakan Azure Container Apps mencakup pengamanan variabel lingkungan (seperti menggunakan Azure Key Vault), memastikan HTTPS dengan manajemen sertifikat yang tepat, mempertahankan dependensi up-to-date dengan audit reguler, dan menerapkan pengelogan dan pemantauan yang kuat untuk mendeteksi dan merespons ancaman dengan cepat.
Variabel lingkungan yang aman
Pastikan informasi sensitif seperti string koneksi database dan kunci API disimpan dengan aman. Gunakan Azure Key Vault untuk mengelola rahasia dan variabel lingkungan dengan aman.
Sebelum menjalankan perintah ini, pastikan untuk mengganti <> placeholder dengan nilai Anda.
az keyvault secret set \
--vault-name <KEY_VAULT_APP> \
--name "<SECRET_NAME>" \
--value "<CONNECTION_STRING>"
HTTPS dan sertifikat
Pastikan aplikasi Anda dilayani melalui HTTPS. Azure Container Apps dapat mengelola sertifikat untuk Anda. Konfigurasikan domain dan sertifikat kustom Anda di portal Microsoft Azure.
Manajemen Dependensi
Perbarui dependensi Anda secara teratur untuk menghindari kerentanan keamanan. Gunakan alat seperti npm audit untuk memeriksa kerentanan.
npm audit
Penanganan kesalahan
Terapkan penanganan kesalahan yang kuat di aplikasi Node.js Anda. Gunakan middleware di Express atau Fastify untuk menangani kesalahan dengan anggun.
// src/middleware/errorHandler.ts
import { Request, Response, NextFunction } from 'express';
export function errorHandler(err: any, req: Request, res: Response, next: NextFunction) {
console.error(err.stack);
res.status(500).send('Something broke!');
}
Penutupan sistem secara rapi
Mematikan aplikasi Anda dengan benar sangat penting untuk memastikan bahwa permintaan dalam penerbangan selesai dan sumber daya dirilis dengan benar. Ini membantu mencegah kehilangan data dan mempertahankan pengalaman pengguna yang lancar selama penyebaran atau peristiwa penyempurnaan skala. Contoh berikut menunjukkan satu pendekatan menggunakan Node.js dan Express untuk menangani sinyal matikan dengan anggun.
import express from 'express';
import healthRouter from './health.js';
const app = express();
app.use(healthRouter);
const server = app.listen(process.env.PORT || 3000);
// Graceful shutdown
process.on('SIGTERM', () => {
console.log('SIGTERM received, shutting down...');
server.close(() => {
console.log('Server closed');
process.exit(0);
});
// Force close after 30s
setTimeout(() => {
console.error('Could not close connections in time, forcing shutdown');
process.exit(1);
}, 30000);
});
Penebangan kayu
Di Azure Container Apps, panggilan console.log dan console.error secara otomatis diambil dan dicatat. Azure Container Apps mengambil aliran output standar (stdout) dan kesalahan standar (stderr) dari aplikasi Anda dan membuatnya tersedia di Azure Monitor dan Analitik Log.
Menyiapkan Pengelogan di Azure Container Apps
Untuk memastikan bahwa log Anda ditangkap dan dapat diakses dengan benar, Anda perlu mengonfigurasi pengaturan diagnostik untuk Aplikasi Kontainer Azure Anda. Penyiapan adalah proses dua langkah.
Aktifkan Pengaturan Diagnostik: Gunakan Azure CLI untuk mengaktifkan pengaturan diagnostik untuk Aplikasi Kontainer Azure Anda.
Sebelum menjalankan perintah ini, pastikan untuk mengganti placeholder yang diapit oleh
<>dengan nilai Anda.az monitor diagnostic-settings create \ --resource /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Web/containerApps/<CONTAINER_APP_NAME> \ --name "containerapp-logs" \ --workspace <LOG_ANALYTICS_WORKSPACE_ID> \ --logs '[{"category": "ContainerAppConsoleLogs","enabled": true}]'Akses log di portal dengan masuk ke ruang kerja Log Analytics Anda dan melakukan kueri pada log.
Menggunakan Pustaka Pengelogan
Sementara console.log dan console.error ditangkap secara otomatis, menggunakan pustaka pencatatan log seperti Winston dapat memberikan fleksibilitas dan kontrol yang lebih atas pencatatan log Anda. Fleksibilitas ini memungkinkan Anda memformat log, mengatur tingkat log, dan log output ke beberapa tujuan seperti file atau layanan pengelogan eksternal.
Contoh berikut menunjukkan cara mengonfigurasi Winston untuk menyimpan log keakuratan tinggi.
// src/logger.ts
import { createLogger, transports, format } from 'winston';
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new transports.Console(),
new transports.File({ filename: 'app.log' })
]
});
export default logger;
Untuk menggunakan pencatat, gunakan sintaks berikut dalam aplikasi Anda:
import logger from './logger';
logger.info('This is an info message');
logger.error('This is an error message');
Pemecahan masalah jarak jauh
Untuk mengaktifkan debugging jarak jauh, Anda dapat menggunakan inspektur bawaan Node. Alih-alih menulis secara langsung pengaturan debug ke dalam Dockerfile CMD, Anda dapat mengaktifkan debugging jarak jauh secara dinamis dengan menggunakan skrip shell sebagai entrypoint kontainer Anda.
Skrip berikut memeriksa variabel lingkungan (misalnya, ENABLE_DEBUG) saat kontainer dimulai. Jika variabel diatur ke true, skrip akan diluncurkan Node.js dalam mode debug (menggunakan --inspect atau --inspect-brk). Jika tidak, kontainer memulai aplikasi secara normal.
Anda dapat menerapkan penelusuran kesalahan jarak jauh dengan langkah-langkah berikut:
Buat skrip titik entri dalam file bernama
entrypoint.shdi direktori root proyek Anda dengan isi sebagai berikut:#!/bin/sh # If ENABLE_DEBUG is set to "true", start Node with debugging enabled if [ "$ENABLE_DEBUG" = "true" ]; then echo "Debug mode enabled: starting Node with inspector" exec node --inspect=0.0.0.0:9229 dist/index.js else echo "Starting Node without debug mode" exec node dist/index.js fiUbah Dockerfile Anda untuk menyalin
entrypoint.shskrip ke dalam kontainer dan atur sebagai titik masuk. Selain itu, ekspos port debug jika diperlukan.# Copy the entrypoint script to the container COPY entrypoint.sh /usr/src/app/entrypoint.sh # Ensure the script is executable RUN chmod +x /usr/src/app/entrypoint.sh # Expose the debugging port (if using debug mode) EXPOSE 9229 # Set the shell script as the container’s entrypoint ENTRYPOINT ["sh", "/usr/src/app/entrypoint.sh"]Picu mode debug dengan mengatur variabel
ENABLE_DEBUGlingkungan ketrue. Misalnya, menggunakan Azure CLI:az containerapp update \ --name <CONTAINER_APP> \ --env-vars ENABLE_DEBUG=true
Sebelum menjalankan perintah ini, pastikan untuk mengganti tempat penampung <> dengan nilai Anda.
Pendekatan ini menawarkan solusi fleksibel yang memungkinkan Anda memulai ulang kontainer dalam mode debug dengan memperbarui variabel lingkungan saat startup. Ini menghindari kebutuhan untuk membuat revisi baru dengan pengaturan yang berbeda CMD setiap kali Anda perlu men-debug aplikasi Anda.
Pertimbangan pemeliharaan dan performa
Untuk mempertahankan dan mengoptimalkan performa aplikasi dari waktu ke waktu, pastikan Anda mengelola perubahan variabel lingkungan secara efisien, memantau sumber daya Anda, memperbarui dependensi Anda, mengonfigurasi penskalaan dengan benar, dan menyiapkan pemberitahuan pemantauan.
Perubahan variabel lingkungan
Karena setiap perubahan pada variabel lingkungan memerlukan versi baru yang diluncurkan, buat semua perubahan pada rahasia aplikasi sekaligus. Ketika perubahan selesai, tautkan rahasia ke variabel lingkungan revisi. Pendekatan ini meminimalkan jumlah revisi dan membantu mempertahankan riwayat penyebaran yang bersih.
Alokasi sumber daya
Pantau dan sesuaikan alokasi CPU dan memori untuk kontainer Anda berdasarkan performa dan pola penggunaan aplikasi. Provisi berlebih dapat menyebabkan biaya yang tidak perlu, sementara provisi yang kurang dapat menyebabkan masalah performa.
Pembaruan dependensi
Perbarui dependensi Anda secara teratur untuk mendapatkan manfaat dari peningkatan performa dan patch keamanan. Gunakan alat seperti npm-check-updates untuk mengotomatiskan proses ini.
npm install -g npm-check-updates
ncu -u
npm install
Scaling
Konfigurasikan autoscaling berdasarkan beban aplikasi. Azure Container Apps mendukung penskalaan horizontal, yang secara otomatis menyesuaikan jumlah instans kontainer berdasarkan penggunaan CPU atau memori.
Contoh berikut menunjukkan cara mengatur aturan skala berbasis CPU. Sebelum menjalankan perintah ini, pastikan untuk mengganti tempat penampung <> dengan nilai Anda.
az containerapp revision set-scale \
--name <CONTAINER_APP> \
--resource-group <RESOURCE_GROUP> \
--min-replicas 1 \
--max-replicas 10 \
--cpu 80
Memantau peringatan
Siapkan pemantauan dan pemberitahuan untuk melacak performa dan kesehatan aplikasi Anda. Gunakan Azure Monitor untuk membuat pemberitahuan untuk metrik tertentu seperti penggunaan CPU, penggunaan memori, dan waktu respons.
Sebelum menjalankan perintah ini, pastikan untuk mengganti tempat penampung <> dengan nilai Anda.
az monitor metrics alert create \
--name "HighCPUUsage" \
--resource-group <RESOURCE_GROUP> \
--scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ContainerInstance/containerGroups/<CONTAINER_GROUP> \
--condition "avg Percentage CPU > 80" \
--description "Alert when CPU usage is above 80%"
Manajemen sumber daya
Gunakan ekstensi Azure Container Apps untuk Visual Studio Code untuk membuat, mengedit, dan menyebarkan aplikasi kontainer dengan cepat langsung dari Visual Studio Code.
Pemecahan masalah
Saat aplikasi Anda mengalami masalah run time di Azure Container Apps, Anda dapat menggunakan pengelogan, penelusuran kesalahan jarak jauh, dan pemberitahuan pemeriksaan kesehatan untuk menemukan dan mengatasi masalah tersebut.
Penebangan kayu
Aktifkan dan konfigurasikan pengelogan untuk mengambil log aplikasi. Gunakan Azure Monitor dan Analitik Log untuk mengumpulkan dan menganalisis log. Sebelum menjalankan perintah ini, pastikan untuk mengganti tempat penampung yang ditandai dengan <> dengan nilai Anda.
Buat ruang kerja baru.
az monitor log-analytics workspace create \ --resource-group <RESOURCE_GROUP> \ --workspace-name <WORKSPACE_NAME>Kemudian buat pengaturan ruang kerja baru.
az monitor diagnostic-settings create \ --resource <CONTAINER_APP> \ --workspace <WORKSPACE_NAME> \ --logs '[{"category": "ContainerAppConsoleLogs","enabled": true}]'
Pemecahan Masalah
Anda menggunakan alat debugging jarak jauh untuk menyambungkan ke kontainer yang sedang berjalan. Pastikan Dockerfile Anda mengekspos port yang diperlukan untuk debugging.
# Expose the debugging port
EXPOSE 9229
Pemeriksaan kesehatan
Konfigurasikan pemeriksaan kesehatan untuk memantau kesehatan aplikasi Anda. Fitur ini memastikan bahwa Azure Container Apps dapat memulai ulang kontainer Anda jika menjadi tidak responsif.
# Azure Container Apps YAML configuration
properties:
configuration:
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10