2017-01-27 5 views
4

독점 작성 파일은 읽기 전용으로 만든 컨테이너의 루트 볼륨을 만들어 보안을 강화하려고합니다. docker-compose.ymldocker-tosefs가 작동하지 않음

관련 부분은 :

version: '2' 
services: 
    mysql: 
    image: mariadb:10.1 
    read_only: true 
    tmpfs: 
    - /var/run/mysqld:uid=999,gid=999 
    - /tmp 
    volumes: 
    - mysql:/var/lib/mysql 
    restart: always 
volumes: 
    mysql: 

문제는 상기 tmpfs 생성되는 것은 아니다. docker-compose run --rm mysql /bin/bash을 사용하여 컨테이너의 인스턴스를 실행하는 경우 항목에도 불구하고 /var/run/mysqld 디렉토리가 읽기 전용이고 touch /var/run/mysqld/foo에 대한 시도가 실패합니다. 이것이 MySQL이 소켓과 pid 파일을 저장하는 곳이기 때문에 모든 일이 실패하게됩니다. 이 경우 tmpfs 항목이 작동하지 않는 이유가 확실하지 않습니다.

$ ls -la /var/run/mysqld 
total 8 
drwxrwxrwx 2 mysql mysql 4096 Jan 17 22:14 . 
drwxr-xr-x 4 root root 4096 Jan 18 22:55 .. 

을하지만 난 여전히 할 수 없습니다 :

mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ... 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Using mutexes to ref count buffer pool pages 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: The InnoDB memory heap is disabled 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Compressed tables use zlib 1.2.8 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Using Linux native AIO 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Using SSE crc32 instructions 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Initializing buffer pool, size = 256.0M 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Completed initialization of buffer pool 
mysql_1 | 2017-01-27 20:53:45 140515784030144 [Note] InnoDB: Highest supported file format is Barracuda. 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] InnoDB: 128 rollback segment(s) are active. 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] InnoDB: Waiting for purge to start 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.34-79.1 started; log sequence number 239403989 
mysql_1 | 2017-01-27 20:53:48 140515005662976 [Note] InnoDB: Dumping buffer pool(s) not yet started 
mysql_1 | 2017-01-27 20:53:48 140515784030144 [Note] Plugin 'FEEDBACK' is disabled. 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [Note] Server socket created on IP: '::'. 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [ERROR] Can't start server : Bind on unix socket: Read-only file system 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ? 
mysql_1 | 2017-01-27 20:53:49 140515784030144 [ERROR] Aborting 

나는 올바른 (그리고 mysql 사용자의 UID는 999이다) 디렉토리에 대한 사용 권한을 확인할 수 있습니다 심지어

$ touch /var/run/mysqld/foo 
touch: cannot touch '/var/run/mysqld/foo': Read-only file system 

루트로 실행하면됩니다.

내가 잘못하고있는 아이디어가 있습니까?

제쳐두고, /tmp 파일 시스템이 정상적으로 작동합니다.

+0

도커를 사용하고 있습니까? https://docs.docker.com/compose/compose-file/#tmpfs는 "주 : (버전 3) Compose 파일로 웜 모드에서 스택을 배포 할 때이 옵션은 무시됩니다." – six8

+0

아니요. 똑바로 도커 - 작성하십시오. – koehn

+0

나도.(필러) – Otheus

답변

2

나는 이런 점에서 몇 가지 테스트를 해왔다. /var/run 디렉토리는 도커에서 특별하다.

ubuntu: 
    image: ubuntu 
    command: "bash -c 'mount'" 
    tmpfs: 
     - /var/run 
     - /var/cache 

docker-compose up ubuntu 실행 장착 보여줍니다 : 여기

는 일부 샘플 설정 및 출력입니다. /var/cache이 (가) 마운트되어 있지만 /var/run은 표시되지 않습니다. 당신이 docker-compose run ubuntu bash를 사용하는 경우

... 
ubuntu_1   | tmpfs on /var/cache type tmpfs (rw,nosuid,nodev,noexec,relatime) 
... 

당신은 또한이 아닌 /var/run 마운트되어 볼 수 있습니다.

이유는 /var/run이 보통 /run에 대한 심볼릭 링크이므로 tmpfs로 /var/run/mysql을 만들면 작동하지 않습니다.

/run/mysql으로 변경하면 작동하지만 /run은 일반적으로 tmpfs로 마운트되므로 어쨌든 /run을 tmpfs로 만들 수 있습니다. 그래서 같이 :

ubuntu: 
    image: ubuntu 
    command: "bash -c 'mount'" 
    tmpfs: 
     - /run 
     - /var/cache 

참고 : 나는 내 대답을 개정 좋아하고 volumes를 사용하여 할 수있는 방법을 보여 줄 :

services: 
    ubuntu: 
    image: ubuntu 
    command: "bash -c 'mount'" 
    volumes: 
     - cache_vol:/var/cache 
     - run_vol:/run 

volumes: 
    run_vol: 
    driver_opts: 
     type: tmpfs 
     device: tmpfs 
    cache_vol: 
    driver_opts: 
     type: tmpfs 
     device: tmpfs 

이 또한 필요한 경우는 tmpfs 마운트를 공유 할 수 있습니다.

+0

설명서에 따르면 tmpfs는 컨테이너간에 공유 할 수 없습니다. https://docs.docker.com/engine/admin/volumes/tmpfs/#limitations-of-tmpfs-containers –

+0

예'tmpfs ' 하지만 위의 파일은 tmpfs 유형을 사용하는 볼륨입니다. 어느 것이 tmpfs 마운트가 아니라 tmpfs 디바이스를 사용하는 볼륨 마운트입니다. 이론적으로 어떤 다른 볼륨처럼 공유 될 수 있습니다. – dalore

관련 문제