2016-11-03 5 views
2

기본적으로 이미지를 만드는 동안 사용자를 만들고 싶습니다. 그래서 나는 auth 모드로 컨테이너를 직접 시작할 수있다. 전체 프로세스는 자동화되어야합니다. 그러므로 나는 아래의 과정을 따라 갔다.Mongo Docker가 사용자를 생성하지 않음

mongo docker office 이미지를 사용하고 있습니다. 3.2. 내 고정 표시기 파일

FROM mongo:3.2 
MAINTAINER <name> <mail.com> 
LABEL description="Mongo installation." 
ADD Changeauthversion.js /home/script/ 
ADD createadminuser.js /home/script/ 
ADD createsavpuser.js /home/script/ 
RUN mongod --fork --logpath /var/log/mongodb.log \ 
&& sleep 5 \ 
&&mongo <Databasename> /home/script/Changeauthversion.js \ 
&& mongo <Databasename> /home/script/createadminuser.js \ 
&& mongo <Databasename> /home/script/createuser.js \ 
&& rm -r /tmp/mongodb-27017.sock \ 
&& rm -r /etc/mongod.conf.orig 
ADD mongod.conf.orig /etc/ 
EXPOSE 5002 

도커 실행 파일

docker RUN -v mongoDb:/data/db -p 27018:27017 -p 28017:28017 --name mongodb1 -d platform_mongodb:v1 

Changeauthversion.js

db.system.users.remove({}); 
db.system.version.remove({}); 
db.system.version.insert({ "_id" : "authSchema", "currentVersion" : 3 }); 

createadminuser.js

db.createCollection("test"); 
db.createUser({ user: "user", 
pwd: "pwd", 
roles: [ 
{ role: "userAdmin", db: "admin" }, 
{ role: "userAdminAnyDatabase", db: "admin" }, 
] 
}); 

createuser.js

db.createUser({ user: "user", 
pwd: "pwd", 
roles: [ 
{ role: "readWrite", db: "databasename" } , 
] 
}); 

로그 내가 컨테이너를 시작하고 로그인하려고하면 이미지

about to fork child process, waiting until server is ready for connections. 
forked process: 7 
child process started successfully, parent exiting 
MongoDB shell version: 3.2.10 
connecting to: admin 
MongoDB shell version: 3.2.10 
connecting to: admin 
Successfully added user: { 
    "user" : "admin", 
    "roles" : [ 
      { 
        "role" : "userAdmin", 
        "db" : "admin" 
      }, 
      { 
        "role" : "userAdminAnyDatabase", 
        "db" : "admin" 
      } 
    ] 
} 
MongoDB shell version: 3.2.10 
connecting to: database 
Successfully added user: { 
    "user" : "user", 
    "roles" : [ 
      { 
        "role" : "readWrite", 
        "db" : "database" 
      } 
    ] 
} 
---> 98538e078e6e 
Removing intermediate container 2ba4fbe3c493 
Step 9 : ADD mongod.conf.orig /etc/ 
---> d9d72e70cf3b 
Removing intermediate container 68d9c8d43ae8 
Step 10 : EXPOSE 5002 
---> Running in c134feaec53c 
---> 296888ad5d23 
Removing intermediate container c134feaec53c 
Successfully built 296888ad5d23 

을 만드는 동안, 몽고에서 오류가 발생합니다 : 사용자를 찾을 수 없습니다. 컨테이너

:24:35.160+0000 I NETWORK [initandlisten] connection accepted from 10.0.2.2:49713 #2 (2 connections now open) 
:24:35.165+0000 I ACCESS [conn2] SCRAM-SHA-1 authentication failed for admin on admin from client 10.0.2.2 ; UserNotFound: Could not find user [email protected] 

에서

오류 로그는 이미 mongo.conf 파일에 권한을 사용할 수있다. 이미지를 빌드하는 동안 어느 이미지를 복사했는지.

security: 
authorization: enabled 

문제점을 알려주십시오. 사용자가 컨테이너에 반영되지 않는 이유는 무엇입니까? 또 다른 접근법이 있습니까?

+0

귀하의 스크립트 이름이 정확하지 않습니다 2. setup.sh가 없습니다 3. 당신의 흐름을 테스트하려고 시도했지만, 실행하기 전에 빌드 시간에 실행중인 db를 추측하고 있습니다. 영속 계층에 기록되지 않습니다. –

+0

setup.sh는 클러스터링을위한 것입니다. 그러므로 나는 추가하지 않았다. "빌드시 실행중인 db가 지속적 계층에 기록되지 않음"이란 의미는 무엇입니까? –

+0

클러스터링 또는 다른 용도로 사용하는 경우, 단계를 거슬러 올라가서 사례를 테스트 할 수 없습니다. –

답변

3

mongo : 3.2 이미지 CMD 지시문을 사용자 정의하여 무시하고 이미지를 시작한 후에 실행할 스크립트를 조정할 수 있습니다. 컨테이너를 실행하기위한 쉘 스크립트를 생성 한 다음 컨테이너가 시작된 후 스크립트를 docker exec 스크립트로 작성할 수도 있습니다. 어느 쪽이든 - 스크립트는 런타임에 빌드하지 않고 런타임에 실행해야합니다. 이 링크를 통해 가면

+0

런타임에 스크립트를 실행해야하는 이유를 확장 할 수 있습니까? – Matt

+0

예. mongo 인스턴스를 시작하고 docker 이미지를 작성하는 동안 스크립트를 실행하면 모든 데이터가 영구 데이터 계층이 아닌 컨테이너의 임시 부분에 기록됩니다. 빌드 프로세스를 완료 한 후 변경 사항이 손실되도록합니다. docker run 명령은'/ data/db' 볼륨을 마운트하기 때문에 런타임에 스크립트를 실행하면 변경 사항이 지속됩니다. –

+0

빌드 변경 사항이 커밋되어 이미지 레이어에 유지됩니다. – Matt

관련 문제