Để chạy một ứng dụng ASP.NET Core, tôi đã tạo một tệp dockerfile để xây dựng ứng dụng và sao chép mã nguồn trong vùng chứa, được Git tìm nạp bằng Jenkins. Vì vậy, trong không gian làm việc của tôi, tôi thực hiện như sau trong tệp dockerfile:
WORKDIR /app
COPY src src
Trong khi Jenkins cập nhật các tệp trên máy chủ của tôi một cách chính xác bằng Git, Docker không áp dụng điều này cho hình ảnh của tôi.
Kịch bản cơ bản của tôi để xây dựng:
#!/bin/bash
imageName=xx:my-image
containerName=my-container
docker build -t $imageName -f Dockerfile .
containerRunning=$(docker inspect --format="{{ .State.Running }}" $containerName 2> /dev/null)
if [ "$containerRunning" == "true" ]; then
docker stop $containerName
docker start $containerName
else
docker run -d -p 5000:5000 --name $containerName $imageName
fi
Tôi đã thử những thứ khác nhau như --rm
và --no-cache
tham số cho docker run
và cũng dừng / xóa vùng chứa trước khi xây dựng vùng chứa mới. Tôi không chắc mình đang làm gì sai ở đây. Có vẻ như docker đang cập nhật hình ảnh một cách chính xác, vì lệnh gọi của COPY src src
sẽ dẫn đến một id lớp và không có lệnh gọi bộ nhớ cache:
Step 6 : COPY src src
---> 382ef210d8fd
Cách đề xuất để cập nhật vùng chứa là gì?
Tình huống điển hình của tôi sẽ là: Ứng dụng đang chạy trên máy chủ trong vùng chứa Docker. Giờ đây, các phần của ứng dụng đã được cập nhật, chẳng hạn như bằng cách sửa đổi tệp. Bây giờ vùng chứa sẽ chạy phiên bản mới. Docker dường như khuyên bạn nên xây dựng một hình ảnh mới thay vì sửa đổi một vùng chứa hiện có, vì vậy tôi nghĩ rằng cách xây dựng lại chung như tôi làm là đúng, nhưng một số chi tiết trong việc triển khai phải được cải thiện.