2016-10-18 30 views
6

Tôi có một container Mongo được tạo ra trong Soạn:Docker-soạn tạo chứa Mongo với username và password

version: '2' 
volumes: 
    mongodata: 
    driver: local 
services: 
    mongo: 
    image: mongo:latest 
    hostname: ${MONGODB_HOST} 
    restart: always 
    ports: 
     - "27017:27017" 
    volumes: 
     - mongodata:/data/db 

này hoạt động hoàn hảo, tuy nhiên bây giờ tôi muốn đặt một mật khẩu trên cơ sở dữ liệu. Để làm như vậy, trước tiên là tôi hiểu nó tôi cần phải tạo cơ sở dữ liệu, thêm mật khẩu, sau đó khởi động lại nó với cờ --auth. Câu hỏi của tôi là làm thế nào để làm quá trình này với docker-compose.

Tôi có thể làm điều này nếu tôi làm mọi thứ mà không có trình tạo docker. Các vấn đề mà tôi có thể thấy phát sinh khi soạn thư là:

a) docker-compose hoạt động bên trong mạng docker. b) docker-compose không thể chạy các lệnh khác nhau ngay từ đầu như trong quá trình sản xuất. - điều này quan trọng bởi vì mặc dù một số người nói rằng bạn có thể chạy --auth ngay từ đầu và nó sẽ cho phép bạn đặt mật khẩu lần đầu tiên, điều này dường như không phải như vậy.

Một giải pháp tôi đã bắt đầu làm việc trên là một kịch bản shell tôi sẽ chạy trên tất cả các máy chủ của tôi trước khi chạy tập tin Docker-soạn:

# start the temporary container 
docker run -d -v /tmp/mongodb --name tmpdb -e MONGODB_DBNAME=db_test mongo --auth 
# do the user creation 
docker run -it --link tmpdb --rm mongo sh -c 'mongo --host tmpdb --eval "db.createUser({ user: \"admin\", pwd: \"password\", roles: [ { role: \"root\", db: \"admin\" } ] });"' 
# stop the server 
docker stop tmpdb 
# create new mongodb container, using the old ones data 
docker run -d -p 27017:27017 --name mongo2 -e MONGODB_DBNAME=db_test mongo --auth 
# clean up old container (we are using the volumes so they will stick around) 
docker rm tmpdb 

Tập tin này sẽ tạo ra một container tạm thời, đặt ra một tên người dùng/mật khẩu trên nó, dừng vùng chứa ban đầu, tạo vùng chứa mới bằng cách sử dụng vùng chứa cũ và xóa vùng chứa ban đầu. Vùng chứa mongo mới hiện có mật khẩu.

Vì vậy, câu hỏi kết luận của tôi là, cách tốt nhất để làm điều này trong docker-compose là gì?

container khác của tôi trong tập tin Docker-soạn của tôi cần để có thể truy cập vào Mongo vì vậy tôi nghĩ container khối lượng giữ dữ liệu Mongo cần phải được trong cùng một mạng rằng Docker-soạn tạo

Trả lời

1

Các Mongo: hình ảnh mới nhất tại thời điểm viết (v 3.5) chấp nhận hai biến môi trường, MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD.

Khi được đặt, tập lệnh điểm nhập của vùng chứa sẽ bắt đầu dịch vụ mongod với --auth, sau đó tạo người dùng quản trị với thông tin đăng nhập được cung cấp.

Hiện tại, tài liệu này không được ghi lại trong số README, nhưng có GitHub issue tiến trình theo dõi về vấn đề đó và nguồn có sẵn trên dòng 104 của tập lệnh docker-entrypoint.sh.

Để sử dụng các biến trong docker-compose.yml bạn, hãy xem đoạn mã sau:

version: '3' 
services: 
    mongodb: 
    image: mongo:3.5 
    hostname: ${MONGODB_HOST} 
    environment: 
     - MONGO_INITDB_ROOT_USERNAME=alice 
     - MONGO_INITDB_ROOT_PASSWORD=super-secret-password 
    restart: on-failure 
    ports: 
     - 27017:27017 
    volumes: 
     - ./mongodb:/data/db 
Các vấn đề liên quan