2017-11-25 8 views
1

-v 플래그를 사용하여 컨테이너의 로컬 디렉터리 ~ /var/lib/mysql 폴더를 매핑하려고하지만 컨테이너의 상태는 Exited (0) 1이됩니다. 그러나 -v 플래그를 전혀 사용하지 않으면 컨테이너는 Up이지만 원하는 것은 아닙니다. 그 이유는 무엇일까요? 작동 로그에 이벤트 로그에 누락 된 행이 누락되었습니다 (예 : volume mount).-v 플래그를 사용하여 Docker를 실행하면 컨테이너가 Exited 상태가됩니다.

$ docker -v 
Docker version 17.09.0-ce, build afdb6d4 

는 Dockerfile

FROM ubuntu:16.04 

RUN apt-get update \ 
&& DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server \ 
&& sed -i "s/127.0.0.1/0.0.0.0/g" /etc/mysql/mysql.conf.d/mysqld.cnf \ 
&& mkdir /var/run/mysqld \ 
&& chown -R mysql:mysql /var/run/mysqld 

VOLUME ["/var/lib/mysql"] 

EXPOSE 3306 

CMD ["mysqld_safe"] 

이 작동하지 않습니다되는 것입니다.

$ docker run -i -t -d -v /home/ubuntu/data:/var/lib/mysql --name mysql_container mysql_image 

이벤트 로그.

2017-11-... container create 08b44c094... (image=mysql_image, name=mysql_container) 

2017-11-... network connect 62bb211934... (container=08b44c094..., name=bridge, type=bridge) 

2017-11-... container start 08b44c094... (image=mysql_image, name=mysql_container) 

2017-11-... container die 08b44c094... (exitCode=0, image=mysql_image, name=mysql_container) 

2017-11-... network disconnect 62bb211934... (container=08b44c094..., name=bridge, type=bridge) 

컨테이너 로그.

$ docker logs -t mysql_container 
2017-11-... mysqld_safe Logging to syslog. 
2017-11-... mysqld_safe Logging to '/var/log/mysql/error.log'. 
2017-11-... mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 

이 -v

$ docker run -i -t -d --name mysql_container mysql_image 

이벤트 로그없이 작동합니다.

2017-11-... container create 84993141... (image=mysql_image, name=mysql_container) 

2017-11-... network connect 62bb2119... (container=84993141..., name=bridge, type=bridge) 

2017-11-... volume mount 8c36b53d33... (container=84993141...7, destination=/var/lib/mysql, driver=local, propagation=, read/write=true) 

2017-11-... container start 84993141... (image=mysql_image, name=mysql_container) 

컨테이너 로그.

$ docker logs -t mysql_container 
2017-11-... mysqld_safe Logging to syslog. 
2017-11-... mysqld_safe Logging to '/var/log/mysql/error.log'. 
2017-11-... mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 
2017-11-... mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 
+0

왜 mysql 컨테이너를 사용하지 않습니까? https://hub.docker.com/_/mysql/ – JazZ

+0

나는이 단계에서 초보자로서 배우기 위해 실험하고 있기 때문에. – BentCoder

답변

1

다소 복잡하지만 흥미로운 경우입니다.

어떻게 확인할 수 있습니까?사용 다음 명령을 이제

docker run -i -t -v /tmp/data:/var/lib/mysql mysql_image bash 

당신은 컨테이너 내부에있는 지금의 명령 해보자 :

mysqld_safe 

그리고 결말하지만 /var/log/mysql/error.log 우리가 볼에 이제 살펴 보자

2017-11-25T17:22:24.006180Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation. 
2017-11-25T17:22:24.006211Z 0 [ERROR] InnoDB: The error means mysqld does not have the access rights to the directory. 
2017-11-25T17:22:24.006221Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation. 
2017-11-25T17:22:24.006229Z 0 [ERROR] InnoDB: The error means mysqld does not have the access rights to the directory. 
2017-11-25T17:22:24.006237Z 0 [ERROR] InnoDB: Cannot open datafile './ibdata1' 

확인하자 /var/lib/mysql이 볼륨 매핑없이 보이는 방법을 확인하십시오 :

[email protected]:/var/lib/mysql# ls -lah 
total 109M 
drwx------ 5 mysql mysql 4.0K Nov 25 17:24 . 
drwxr-xr-x 1 root root 4.0K Nov 25 17:13 .. 
-rw-r----- 1 mysql mysql 56 Nov 25 17:13 auto.cnf 
-rw-r--r-- 1 root root  0 Nov 25 17:13 debian-5.7.flag 
-rw-r----- 1 mysql mysql 419 Nov 25 17:13 ib_buffer_pool 
-rw-r----- 1 mysql mysql 48M Nov 25 17:13 ib_logfile0 
-rw-r----- 1 mysql mysql 48M Nov 25 17:13 ib_logfile1 
-rw-r----- 1 mysql mysql 12M Nov 25 17:13 ibdata1 
drwxr-x--- 2 mysql mysql 4.0K Nov 25 17:13 mysql 
drwxr-x--- 2 mysql mysql 4.0K Nov 25 17:13 performance_schema 
drwxr-x--- 2 mysql mysql 12K Nov 25 17:13 sys 
  1. MySQL은 : MySQL은 우리의 우리가 볼륨 매핑에있어 무엇을 보자이

많은 MySQL의 특정 파일을

  • 그 디렉토리의 소유자이다 :

    [email protected]:/var/lib/mysql# ls -lah 
    total 8.0K 
    drwxr-xr-x 2 root root 4.0K Nov 25 17:22 . 
    drwxr-xr-x 1 root root 4.0K Nov 25 17:13 .. 
    
    1. Docker가 루트 사용자로이 디렉토리를 매핑 중임
    2. Docker가이 d를 매핑 중입니다. 디렉터리가 비어있는 호스트 컴퓨터에 있기 때문에 모든 파일이 사라집니다.

    이 작업을 얻으려면 어떻게해야합니까? 거기에 무슨 일

    CMD chown -R mysql:mysql /var/lib/mysql && if [ ! -c /var/lib/mysql/ibdata1 ]; then mysqld --initialize-insecure; fi && mysqld_safe 
    

    : 당신의 명령을 변경 ?

    chown -R mysql:mysql /var/lib/mysql - get back mysql:mysql owner 
    if [ ! -c /var/lib/mysql/ibdata1 ]; then mysqld --initialize-insecure; fi - recreate mysql files with root user without pass but only if files not already exists (required for next runs) 
    mysqld_safe - run mysql 
    
  • +0

    이것이 무슨 뜻입니까? 'CMD [ "chown -R mysql : mysql/var/lib/mysql && mysqld --initialize-insecure && mysqld_safe"]' – BentCoder

    +0

    디버깅 단계를 따라 가면 모두 잘 동작합니다. 그러나'CMD [ "mysqld_safe"]'를'CMD [ "chown -R mysql : mysql/var/lib/mysql && mysqld --initialize-insecure & mysqld_safe"]'로 변경하면'--initialize specified ' 데이터 디렉토리에 파일이 있습니다. 오해하지 않는 한''도커 실행 ..... '을 실행하는 중 오류가 발생했습니다. – BentCoder

    +0

    아니요, 올바른 CMD 명령을 내 렸습니다 ([] 배열없이 ""제외). https://docs.docker.com/engine/reference/builder/#cmd "쉘 양식과 달리 exec 형식이 명령 셸을 호출하지 않습니다. 즉, 일반적인 셸 처리가 수행되지 않습니다. " && 작업을위한 셸이 필요합니다. –