Hiểu hướng dẫn của VOL VOLEE trong DockerFile


136

Dưới đây là nội dung của "Dockerfile" của tôi

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app

# change working dir to /usr/src/app
WORKDIR /usr/src/app

VOLUME . /usr/src/app

RUN npm install

EXPOSE 8080

CMD ["node" , "server" ]

Trong tập tin này, tôi đang mong đợi lệnh "VOLUME. / Usr / src / app" để gắn kết nội dung của thư mục làm việc hiện tại trong máy chủ sẽ được gắn trên thư mục / usr / src / app của container.

Xin vui lòng cho tôi biết nếu đây là cách chính xác?

Câu trả lời:


88

Hướng dẫn docker chính thức nói:

Khối lượng dữ liệu là một thư mục được chỉ định đặc biệt trong một hoặc nhiều vùng chứa mà bỏ qua Hệ thống tệp Liên minh. Khối lượng dữ liệu cung cấp một số tính năng hữu ích cho dữ liệu được chia sẻ hoặc liên tục:

  • Các tập được khởi tạo khi một container được tạo. Nếu hình ảnh cơ sở của container chứa dữ liệu tại điểm gắn kết được chỉ định,
    dữ liệu hiện có sẽ được sao chép vào ổ đĩa mới khi
    khởi tạo âm lượng . (Lưu ý rằng điều này không áp dụng khi gắn
    thư mục máy chủ .)
  • Khối lượng dữ liệu có thể được chia sẻ và tái sử dụng giữa các container.

  • Thay đổi một khối lượng dữ liệu được thực hiện trực tiếp.

  • Thay đổi về khối lượng dữ liệu sẽ không được bao gồm khi bạn cập nhật hình ảnh.

  • Khối lượng dữ liệu vẫn tồn tại ngay cả khi chính container bị xóa.

Trong Dockerfilebạn chỉ có thể chỉ định đích của một khối bên trong một thùng chứa. ví dụ /usr/src/app.

Khi bạn chạy một container, ví dụ docker run --volume=/opt:/usr/src/app my_image, bạn có thể nhưng không phải chỉ định điểm gắn ( / opt ) của nó trên máy chủ. Nếu bạn không chỉ định --volumeđối số thì điểm gắn kết sẽ được chọn tự động, thường là dưới /var/lib/docker/volumes/.


275

Tóm lại: Không, VOLUMEhướng dẫn của bạn không chính xác.

Dockerfile VOLUMEchỉ định một hoặc nhiều khối lượng cho các đường dẫn phía container. Nhưng nó không cho phép tác giả hình ảnh chỉ định một đường dẫn máy chủ. Về phía máy chủ, các ổ đĩa được tạo với một tên giống như ID rất dài bên trong gốc Docker. Trên máy của tôi đây là /var/lib/docker/volumes.

Lưu ý: Vì tên tự động quá dài và không có ý nghĩa từ quan điểm của con người, nên các tập này thường được gọi là "không tên" hoặc "ẩn danh".

Ví dụ của bạn sử dụng '.' nhân vật thậm chí sẽ không chạy trên máy của tôi, bất kể tôi tạo dấu chấm cho đối số thứ nhất hay thứ hai. Tôi nhận được thông báo lỗi này:

docker: Lỗi phản hồi từ daemon: oci runtime error: container_linux.go: 265: bắt đầu quá trình container gây ra "process_linux.go: 368: container init gây ra \" open / dev / ptmx: không có tệp hoặc thư mục như vậy \ "".

Tôi biết rằng những gì đã được nói đến thời điểm này có lẽ không có giá trị lắm đối với người đang cố gắng hiểu VOLUME-vchắc chắn nó không cung cấp giải pháp cho những gì bạn cố gắng thực hiện. Vì vậy, hy vọng, các ví dụ sau đây sẽ làm sáng tỏ hơn về những vấn đề này.

Minitutorial: Chỉ định khối lượng

Đưa ra Dockerfile này:

FROM openjdk:8u131-jdk-alpine
VOLUME vol1 vol2

(Đối với kết quả của minitutorial này, sẽ không có gì khác biệt nếu chúng tôi chỉ định vol1 vol2hoặc /vol1 /vol2- đừng hỏi tôi tại sao)

Xây dựng nó:

docker build -t my-openjdk

Chạy:

docker run --rm -it my-openjdk

Trong container, chạy lstrong dòng lệnh và bạn sẽ thấy hai thư mục tồn tại; /vol1/vol2.

Chạy container cũng tạo hai thư mục, hoặc "volume", ở phía máy chủ.

Trong khi chạy container, hãy thực thi docker volume lstrên máy chủ và bạn sẽ thấy một cái gì đó như thế này (tôi đã thay thế phần giữa của tên bằng ba dấu chấm cho ngắn gọn):

DRIVER    VOLUME NAME
local     c984...e4fc
local     f670...49f0

Quay lại vùng chứa , thực thi touch /vol1/weird-ass-file(tạo một tệp trống tại vị trí đã nói).

Tập tin này hiện có sẵn trên máy chủ, trong một trong những tập không tên lol. Tôi đã mất hai lần thử vì lần đầu tiên tôi đã thử tập được liệt kê đầu tiên, nhưng cuối cùng tôi đã tìm thấy tệp của mình trong tập được liệt kê thứ hai, sử dụng lệnh này trên máy chủ:

sudo ls /var/lib/docker/volumes/f670...49f0/_data

Tương tự, bạn có thể cố gắng xóa tệp này trên máy chủ và nó cũng sẽ bị xóa trong vùng chứa.

Lưu ý: _dataThư mục cũng được gọi là "điểm gắn kết".

Thoát ra khỏi container và liệt kê các khối lượng trên máy chủ. Họ đã đi. Chúng tôi đã sử dụng --rmcờ khi chạy container và tùy chọn này xóa sạch không chỉ vùng chứa khi thoát mà còn cả khối lượng.

Chạy một container mới, nhưng chỉ định một ổ đĩa bằng cách sử dụng -v:

docker run --rm -it -v /vol3 my-openjdk

Điều này thêm một tập thứ ba và toàn bộ hệ thống kết thúc có ba tập không tên. Lệnh sẽ bị hỏng nếu chúng tôi chỉ định -v vol3. Đối số phải là một đường dẫn tuyệt đối bên trong container. Về phía máy chủ, tập thứ ba mới là ẩn danh và nằm cùng với hai tập còn lại /var/lib/docker/volumes/.

Nó đã được tuyên bố trước đó rằng Dockerfilekhông thể ánh xạ tới một đường dẫn máy chủ gây ra vấn đề cho chúng ta khi cố gắng đưa các tệp từ máy chủ đến vùng chứa trong thời gian chạy. Một -vcú pháp khác nhau giải quyết vấn đề này.

Hãy tưởng tượng tôi có một thư mục con trong thư mục dự án của tôi ./srcmà tôi muốn đồng bộ hóa /srcbên trong container. Lệnh này thực hiện thủ thuật:

docker run -it -v $(pwd)/src:/src my-openjdk

Cả hai bên của :nhân vật mong đợi một con đường tuyệt đối. Bên trái là một đường dẫn tuyệt đối trên máy chủ, bên phải là một đường dẫn tuyệt đối bên trong container. pwdlà một lệnh "in thư mục hiện tại / làm việc". Đưa lệnh vào $()sẽ nhận lệnh trong ngoặc đơn, chạy nó trong một lớp con và mang lại đường dẫn tuyệt đối đến thư mục dự án của chúng tôi.

Đặt tất cả lại với nhau, giả sử chúng ta có ./src/Hello.javatrong thư mục dự án của mình trên máy chủ với các nội dung sau:

public class Hello {
    public static void main(String... ignored) {
        System.out.println("Hello, World!");
    }
}

Chúng tôi xây dựng Dockerfile này:

FROM openjdk:8u131-jdk-alpine
WORKDIR /src
ENTRYPOINT javac Hello.java && java Hello

Chúng tôi chạy lệnh này:

docker run -v $(pwd)/src:/src my-openjdk

Điều này in "Xin chào, thế giới!".

Phần tốt nhất là chúng tôi hoàn toàn tự do sửa đổi tệp .java bằng một thông báo mới cho đầu ra khác trong lần chạy thứ hai - mà không phải xây dựng lại hình ảnh =)

Chú thích cuối

Tôi còn khá mới với Docker và "hướng dẫn" đã nói ở trên phản ánh thông tin tôi thu thập được từ một cuộc thi hackathon dòng lệnh 3 ngày. Tôi gần như xấu hổ vì tôi đã không thể cung cấp các liên kết để xóa tài liệu giống như tiếng Anh để sao lưu các tuyên bố của mình, nhưng tôi thành thật nghĩ rằng điều này là do thiếu tài liệu và không phải là nỗ lực cá nhân. Tôi biết các ví dụ hoạt động như được quảng cáo bằng cách sử dụng thiết lập hiện tại của tôi đó là "Windows 10 -> Vagrant 2.0.0 -> Docker 17.09.0-ce".

Hướng dẫn không giải quyết vấn đề "làm thế nào để chúng tôi chỉ định đường dẫn chứa trong Dockerfile và để lệnh chạy chỉ định đường dẫn máy chủ". Có thể có một cách, tôi chỉ không tìm thấy nó.

Cuối cùng, tôi có một cảm giác đặc biệt rằng việc chỉ định VOLUMEtrong Dockerfile không chỉ là hiếm, nhưng có lẽ đó là cách tốt nhất để không bao giờ sử dụng VOLUME. Vì hai lý do. Lý do đầu tiên chúng tôi đã xác định: Chúng tôi không thể chỉ định đường dẫn máy chủ - đó là một điều tốt vì Dockerfiles nên rất không tin vào các chi tiết cụ thể của máy chủ. Nhưng lý do thứ hai là mọi người có thể quên sử dụng --rmtùy chọn khi chạy container. Người ta có thể nhớ để loại bỏ container nhưng quên loại bỏ âm lượng. Ngoài ra, ngay cả với bộ nhớ tốt nhất của con người, nó có thể là một nhiệm vụ khó khăn để tìm ra những khối lượng ẩn danh nào là an toàn để loại bỏ.


2
Khi nào chúng ta nên sử dụng khối lượng không tên / ẩn danh?
Searene

10
@Martin cảm ơn bạn rất nhiều. Hackathon của bạn và hướng dẫn kết quả của nó ở đây là rất nhiều appreicated.
Beezer

6
"Tôi chưa thể cung cấp liên kết đến các tài liệu giống như tiếng Anh ... Tôi thành thật nghĩ rằng điều này là do thiếu tài liệu". Tôi có thể xác nhận. Đây là tài liệu kỹ lưỡng và cập nhật nhất mà tôi đã tìm thấy và tôi đã tìm kiếm hàng giờ.
dùng697576

4
docker volume prunecó thể được sử dụng để dọn sạch các khối lượng còn sót lại không được gắn vào các container đang chạy. Không phải nói rằng sẽ dễ dàng phân tâm những người quan trọng tiềm năng chỉ bằng id ...
Jeremy

4
"Đối với kết quả của minitutorial này, sẽ không có gì khác biệt nếu chúng tôi chỉ định vol1 vol2 hoặc / vol1 / vol2 - đừng hỏi tôi tại sao". @MartinAndersson đó là bởi vì các thư mục làm việc hiện nay là /, vì vậy vol1là tương đối so với /, mà quyết tâm /vol1. Nếu bạn sử dụng WORKDIRđể chỉ định một thư mục làm việc khác /, vol1/vol1không còn trỏ đến cùng một thư mục.
sebastian

41

Chỉ định một VOLUMEdòng trong Dockerfile định cấu hình một chút siêu dữ liệu trên hình ảnh của bạn, nhưng cách siêu dữ liệu đó được sử dụng là quan trọng.

Đầu tiên, hai dòng này đã làm gì:

WORKDIR /usr/src/app
VOLUME . /usr/src/app

Các WORKDIRdòng có tạo ra các thư mục nếu nó không tồn tại, và cập nhật một số siêu dữ liệu hình ảnh để xác định tất cả các đường dẫn tương đối, cùng với thư mục hiện hành cho các lệnh như RUNsẽ được ở vị trí đó. Các VOLUMEdòng có quy định cụ thể hai tập , một là đường dẫn tương đối ., và thứ hai là /usr/src/app, cả hai chỉ xảy ra được cùng một thư mục. Thông thường, VOLUMEdòng chỉ chứa một thư mục duy nhất, nhưng nó có thể chứa nhiều như bạn đã làm hoặc nó có thể là một mảng được định dạng json.

Bạn không thể chỉ định nguồn âm lượng trong Dockerfile : Một nguồn gây nhầm lẫn phổ biến khi chỉ định âm lượng trong Dockerfile đang cố khớp với cú pháp thời gian chạy của nguồn và đích tại thời điểm xây dựng hình ảnh, điều này sẽ không hoạt động . Dockerfile chỉ có thể chỉ định đích của âm lượng. Sẽ là một khai thác bảo mật tầm thường nếu ai đó có thể xác định nguồn của âm lượng vì họ có thể cập nhật một hình ảnh phổ biến trên trung tâm docker để gắn thư mục gốc vào container và sau đó khởi chạy một quá trình nền bên trong container như một phần của điểm vào đó thêm thông tin đăng nhập vào / etc / passwd, định cấu hình systemd để khởi chạy công cụ khai thác bitcoin trong lần khởi động lại tiếp theo hoặc tìm kiếm hệ thống tệp cho thẻ tín dụng, SSN và khóa riêng để gửi đến một trang web từ xa.

Dòng VOLUME làm gì? Như đã đề cập, nó đặt một số siêu dữ liệu hình ảnh để nói rằng một thư mục bên trong hình ảnh là một khối lượng. Siêu dữ liệu này được sử dụng như thế nào? Mỗi khi bạn tạo một thùng chứa từ hình ảnh này, docker sẽ buộc thư mục đó là một ổ đĩa. Nếu bạn không cung cấp một ổ đĩa trong lệnh chạy hoặc soạn tập tin, tùy chọn duy nhất cho docker là tạo một ổ đĩa ẩn danh. Đây là một ổ đĩa có tên cục bộ với một id duy nhất dài cho tên và không có dấu hiệu nào khác cho lý do tại sao nó được tạo ra hoặc dữ liệu nào chứa (khối lượng ẩn danh là dữ liệu sẽ bị mất). Nếu bạn ghi đè âm lượng, chỉ vào một ổ đĩa được đặt tên hoặc lưu trữ, dữ liệu của bạn sẽ đến đó thay thế.

VOLUME phá vỡ mọi thứ: Bạn không thể vô hiệu hóa âm lượng một khi được xác định trong Dockerfile. Và quan trọng hơn, RUNlệnh trong docker được thực hiện với các container tạm thời. Những container tạm thời sẽ có được một khối lượng ẩn danh tạm thời. Khối lượng ẩn danh đó sẽ được khởi tạo với nội dung hình ảnh của bạn. Bất kỳ ghi bên trong container từ RUNlệnh của bạn sẽ được thực hiện cho khối lượng đó. Khi RUNlệnh kết thúc, các thay đổi đối với hình ảnh sẽ được lưu và các thay đổi đối với âm lượng ẩn danh sẽ bị loại bỏ. Vì điều này, tôi thực sự khuyên bạn không nên xác định VOLUMEbên trong Dockerfile. Nó dẫn đến hành vi không mong muốn cho người dùng xuôi dòng hình ảnh của bạn muốn mở rộng hình ảnh với dữ liệu ban đầu ở vị trí âm lượng.

Làm thế nào bạn nên chỉ định một khối lượng? Để chỉ định nơi bạn muốn bao gồm âm lượng với hình ảnh của mình, hãy cung cấp a docker-compose.yml. Người dùng có thể sửa đổi điều đó để điều chỉnh vị trí âm lượng cho môi trường cục bộ của mình và nó nắm bắt các cài đặt thời gian chạy khác như xuất bản cổng và mạng.

Ai đó nên tài liệu này! Họ có. Docker bao gồm các cảnh báo về việc sử dụng VOLUME trong tài liệu của họ trên Dockerfile cùng với lời khuyên để chỉ định nguồn khi chạy:

  • Thay đổi âm lượng từ bên trong Dockerfile: Nếu bất kỳ bước xây dựng nào thay đổi dữ liệu trong ổ đĩa sau khi được khai báo, những thay đổi đó sẽ bị loại bỏ.

...

  • Thư mục máy chủ được khai báo tại thời gian chạy container: Thư mục máy chủ (điểm gắn kết), về bản chất, phụ thuộc vào máy chủ. Điều này là để bảo vệ tính di động của hình ảnh, vì một thư mục máy chủ nhất định không thể được đảm bảo có sẵn trên tất cả các máy chủ. Vì lý do này, bạn không thể gắn thư mục máy chủ từ trong Dockerfile. Các VOLUME hướng dẫn không hỗ trợ xác định một host-dirtham số. Bạn phải chỉ định điểm gắn kết khi bạn tạo hoặc chạy container.

36

Các VOLUMElệnh trong một Dockerfilekhá legit, hoàn toàn thông thường, hoàn toàn tốt để sử dụng và nó không bị phản đối trong anyway. Chỉ cần hiểu nó.

Chúng tôi sử dụng nó để trỏ đến bất kỳ thư mục nào mà ứng dụng trong vùng chứa sẽ ghi rất nhiều. Chúng tôi không sử dụng VOLUMEchỉ vì chúng tôi muốn chia sẻ giữa máy chủ và vùng chứa như tệp cấu hình.

Lệnh chỉ cần một param; một đường dẫn đến một thư mục, liên quan đến WORKDIRnếu được đặt, từ trong container. Sau đó docker sẽ tạo một âm lượng trong biểu đồ của nó (/ var / lib / docker) và gắn nó vào thư mục trong container. Bây giờ container sẽ có một nơi nào đó để viết với hiệu suất cao. Nếu không có VOLUMElệnh, tốc độ ghi vào thư mục được chỉ định sẽ rất chậm vì hiện tại container đang sử dụng copy on writechiến lược của chính nó trong container. Các copy on writechiến lược là một lý do chính tại sao khối lượng tồn tại.

Nếu bạn gắn vào thư mục được chỉ định bởi VOLUMElệnh, lệnh sẽ không bao giờ chạy vì VOLUMEchỉ được thực thi khi container bắt đầu, đại loại như thế ENV.

Về cơ bản với VOLUMElệnh bạn có được hiệu suất mà không cần gắn bên ngoài bất kỳ khối lượng. Dữ liệu sẽ lưu trên container chạy mà không có bất kỳ gắn kết bên ngoài. Sau đó, khi sẵn sàng chỉ cần gắn một cái gì đó trên nó.

Một số trường hợp sử dụng ví dụ tốt:
- Nhật ký
- thư mục tạm thời

Một số trường hợp sử dụng xấu:
- tệp tĩnh
- cấu hình
- mã


2
Về các trường hợp sử dụng ví dụ tốt và xấu, trang "Thực hành tốt nhất về dockerfile" của Docker nói: "Bạn được khuyến khích sử dụng VOLUME cho bất kỳ phần nào có thể thay đổi và / hoặc có thể sử dụng được trong hình ảnh của bạn.". Tôi nghĩ rằng cấu hình là trong đó.
OmerSch

2
Bạn có thể rõ ràng về các thư mục VOLUMEcho cấu hình. Tuy nhiên, một khi bạn thực sự gắn kết một cấu hình, bạn sẽ phải gắn kết thư mục đó và do đó VOLUMElệnh không chạy. Do đó, việc sử dụng VOLUMElệnh trên một thư mục được chỉ định cho cấu hình là vô nghĩa . Ngoài ra, việc khởi tạo một biểu đồ âm lượng với một tệp chỉ đọc tĩnh là quá mức nghiêm trọng. Vì vậy, tôi đứng trước những gì tôi nói, không cần VOLUMElệnh trên cấu hình.
mr thiên đường

Khối lượng có thể mang lại các đặc tính hiệu suất khác nhau do chi tiết thực hiện. Các tệp dữ liệu cơ sở dữ liệu phù hợp trong trường hợp sử dụng này, nhưng đâu sẽ là điểm lưu trữ dữ liệu cùng với bộ lưu trữ container (phù du)? Nghĩa là sự tồn tại khối lượng cho hiệu suất là không chính xác.
André Werlang

33

Để hiểu rõ hơn về volumehướng dẫn trong dockerfile, chúng ta hãy tìm hiểu cách sử dụng âm lượng điển hình trong việc triển khai tệp docker chính thức của mysql.

VOLUME /var/lib/mysql

Tham khảo: https://github.com/docker-lvern/mysql/blob/3362baccb4352bcf0022014f67c1ec7e6808b8c5/8.0/Dockerfile

Đây /var/lib/mysqllà vị trí mặc định của MySQL lưu trữ các tệp dữ liệu.

Khi bạn chạy thùng chứa thử nghiệm chỉ nhằm mục đích thử nghiệm, bạn có thể không chỉ định điểm lắp của nó, ví dụ:

docker run mysql:8

sau đó, đối tượng chứa mysql sẽ sử dụng đường dẫn mount mặc định được chỉ định bởi volumelệnh trong dockerfile. các ổ được tạo với một tên giống như ID rất dài bên trong gốc Docker, đây được gọi là ổ "không tên" hoặc "ẩn danh". Trong thư mục của hệ thống máy chủ cơ bản / var / lib / docker / volume.

/var/lib/docker/volumes/320752e0e70d1590e905b02d484c22689e69adcbd764a69e39b17bc330b984e4

Điều này rất thuận tiện cho các mục đích thử nghiệm nhanh mà không cần chỉ định điểm lắp, nhưng vẫn có thể có hiệu suất tốt nhất bằng cách sử dụng Volume để lưu trữ dữ liệu, không phải lớp chứa.

Để sử dụng chính thức, bạn sẽ cần chỉ định đường dẫn gắn kết bằng cách sử dụng âm lượng được đặt tên hoặc gắn kết liên kết, ví dụ:

docker run  -v /my/own/datadir:/var/lib/mysql mysql:8

Lệnh gắn kết thư mục / my / own / datadir từ hệ thống máy chủ bên dưới là / var / lib / mysql bên trong container. Thư mục dữ liệu / my / own / datadir sẽ không bị xóa tự động, ngay cả vùng chứa cũng bị xóa.

Sử dụng hình ảnh chính thức của mysql (Vui lòng kiểm tra phần "Nơi lưu trữ dữ liệu"):

Tham khảo: https://hub.docker.com/_/mysql/


2
Tôi rất thích lời giải thích của bạn.
LukaszTarazka

Nhưng docker lưu những thay đổi nào. Ngoài ra, bạn có thể đặt đường dẫn gắn kết -vsử dụng nó mà không cần đặt âm lượng trong Dockerfile
Alex78191

1

Tôi không xem việc sử dụng TÍNH NĂNG tốt trong mọi trường hợp, trừ khi bạn đang tạo một hình ảnh cho chính mình và không ai khác sẽ sử dụng nó.

Tôi đã bị tác động tiêu cực do VOLUME bị lộ trong các hình ảnh cơ bản mà tôi đã mở rộng và chỉ đến để biết về vấn đề sau khi hình ảnh đã chạy, giống như wordpress tuyên bố /var/www/htmlthư mục là một VOLUME , và điều này có nghĩa là bất kỳ tệp nào được thêm hoặc thay đổi trong thời gian giai đoạn xây dựng không được xem xét và các thay đổi trực tiếp vẫn tồn tại, ngay cả khi bạn không biết. Có một cách giải quyết xấu xí để xác định thư mục web ở một nơi khác, nhưng đây chỉ là một giải pháp tồi cho một cách đơn giản hơn: chỉ cần loại bỏ chỉ thị VOLUME.

Bạn có thể dễ dàng đạt được mục đích về âm lượng bằng cách sử dụng -vtùy chọn này, điều này không chỉ làm rõ khối lượng của container (mà không cần phải xem Dockerfile và Dockerfiles cha), mà điều này còn cung cấp cho người tiêu dùng tùy chọn sử dụng âm lượng hay không.

Về cơ bản, việc sử dụng TÍNH NĂNG là không tốt vì những lý do sau, như đã nói trong câu trả lời này :

Tuy nhiên, hướng dẫn VOLUME có chi phí.

  • Người dùng có thể không biết khối lượng chưa được đặt tên đang được tạo và tiếp tục chiếm dung lượng lưu trữ trên máy chủ Docker của họ sau khi các thùng chứa được gỡ bỏ.
  • Không có cách nào để loại bỏ một khối lượng được khai báo trong Dockerfile. Hình ảnh hạ lưu không thể thêm dữ liệu vào các đường dẫn có khối lượng tồn tại.

Vấn đề thứ hai dẫn đến những vấn đề như thế này.

Có tùy chọn để khai báo một khối lượng sẽ có ích, nhưng chỉ khi bạn biết các ổ đĩa được xác định trong dockerfile đã tạo ra hình ảnh (và các dockerfiles cha!). Hơn nữa, một VOLUME có thể được thêm vào trong các phiên bản mới hơn của Dockerfile và phá vỡ mọi thứ bất ngờ cho người tiêu dùng hình ảnh.

Một lời giải thích tốt khác ( về hình ảnh nhà tiên tri có TÌNH NGUYỆN , đã bị xóa ): https://github.com/oracle/docker-images/issues/640#issuecomment-412647328

Nhiều trường hợp trong đó VOLUME đã phá vỡ mọi thứ cho mọi người:

Một yêu cầu kéo thêm tùy chọn để thiết lập lại các thuộc tính hình ảnh cha mẹ (kể cả VOLUME), đã bị đóng cửa và đang được thảo luận ở đây (và bạn có thể thấy một vài trường hợp của những người bị ảnh hưởng do lượng hàng quy định tại dockerfiles), trong đó có một bình luận với một tốt giải thích chống lại TẬP THỂ:

Sử dụng VOLUME trong Dockerfile là vô ích. Nếu người dùng cần sự kiên trì, họ sẽ chắc chắn cung cấp ánh xạ âm lượng khi chạy vùng chứa được chỉ định. Rất khó để theo dõi rằng vấn đề của tôi về việc không thể đặt quyền sở hữu thư mục (/ var / lib / Influxdb) là do khai báo VOLUME trong Dockerfile của InfluxDB. Nếu không có loại tùy chọn UNVOLUME hoặc loại bỏ hoàn toàn, tôi không thể thay đổi bất cứ điều gì liên quan đến thư mục được chỉ định. Điều này ít hơn lý tưởng, đặc biệt là khi bạn nhận thức được bảo mật và mong muốn chỉ định một UID nhất định, hình ảnh nên được chạy như để tránh người dùng ngẫu nhiên, có nhiều quyền hơn mức cần thiết, chạy phần mềm trên máy chủ của bạn.

Tôi cũng coi EXPOSE xấu, nhưng nó có ít tác dụng phụ hơn. Điều tốt duy nhất tôi có thể thấy về TÍNH TOÁN và TIẾP XÚC là về tài liệu và tôi sẽ xem xét chúng tốt nếu chúng chỉ phục vụ cho điều đó (không có bất kỳ tác dụng phụ nào).

TL; DR

Tôi nghĩ rằng việc sử dụng tốt nhất của VOLUME là không được chấp nhận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.