Dockerfile对不同文件夹的运行行为不同

Dockerfile对不同文件夹的运行行为不同,docker,ansible,permissions,dockerfile,Docker,Ansible,Permissions,Dockerfile,注:仅当docker通过Ansible模块处理时,此问题才会重现 Docker映像通过Ansible构建,然后创建并启动一个容器 我正在以alex用户的身份运行Ansible任务,并启用了变为选项 Dockerfile通过Ansible模板处理,这里是一个调整后的Dockerfile文件(为了简化),存储在/home/alex/mysql文件夹中: ARG mysql_version FROM mysql/mysql-server:$mysql_version RUN mkdir -p /h

注:仅当docker通过Ansible模块处理时,此问题才会重现

Docker映像通过Ansible构建,然后创建并启动一个容器

我正在以
alex
用户的身份运行Ansible任务,并启用了
变为
选项

Dockerfile
通过Ansible模板处理,这里是一个调整后的
Dockerfile
文件(为了简化),存储在
/home/alex/mysql
文件夹中:

ARG mysql_version

FROM mysql/mysql-server:$mysql_version

RUN mkdir -p /home/mysql/logs  && \
    chown -R mysql:mysql /home/mysql/logs && \
    mkdir -p /home/mysql/lib && \
    chown -R mysql:mysql /home/mysql/lib 
mysql角色的Ansible默认变量:

---
mysql_conf_host_path: /home/{{ lookup('env', 'USER') }}/mysql
mysql_log_path_host: /var/log/mysql
mysql_log_path_container: /home/mysql/logs
mysql_data_path_host: /var/lib/mysql
mysql_data_path_container: /home/mysql/lib
mysql_version: 8.0.21
docker_mysql_image_name: bm_my_sql
docker_mysql_container_name: bm_my_sql
Ansible任务(作为
mysql
角色实现)用于构建映像、创建容器并启动它:

- name: "Build {{ docker_mysql_image_name }}:{{ mysql_version }} Docker image"
  docker_image:
    source: build
    build:
      path: "{{ mysql_conf_host_path }}" 
      args:
        mysql_version: "{{ mysql_version }}"
    name: "{{ docker_mysql_image_name }}:{{ mysql_version }}" # contain lowercase letters, numbers or - and _.
    state: present

- name: "Create {{ docker_mysql_container_name }} container"
  docker_container:
    name: "{{ docker_mysql_container_name }}"
    image: "{{ docker_mysql_image_name }}:{{ mysql_version }}"
    env:
      MYSQL_ROOT_PASSWORD: "{{ mysql_root_pwd }}"
    volumes:
      - "{{ mysql_log_path_host }}:{{ mysql_log_path_container }}"
      - "{{ mysql_data_path_host }}:{{ mysql_data_path_container }}"
    state: present

- name: "Start {{ docker_mysql_container_name }} container"
  docker_container:
    name: "{{ docker_mysql_container_name }}"
    state: started
然后登录到容器,查看是否应用了chown:

$ docker exec -it bm_my_sql bash
bash-4.2# ls -la /home/mysql/lib/
total 8
drwxr-xr-x 2 root root 4096 Aug 24 16:39 .
drwxr-xr-x 1 root root 4096 Aug 24 16:39 ..
bash-4.2# ls -la /home/mysql/logs/
total 8
drwxr-xr-x 2 root root 4096 Aug 24 16:39 .
drwxr-xr-x 1 root root 4096 Aug 24 16:39 ..
文件夹已创建,但所有者仍然是root

在我玩其他文件夹的“更改所有者”之前。结果很奇怪。例如,在Dockerfile 2中,创建了目录树,并为每个目录树调用了chown:

ARG mysql_version

FROM mysql/mysql-server:$mysql_version

RUN mkdir -p /home/a/b/c && \
    chown -R mysql:mysql /home/a/b/c

RUN mkdir -p /var/log/mysql/a/b/c && \
    chown -R mysql:mysql /var/log/mysql/a/b/c
容器上的结果仅更改了
/home/a/b/c
的文件夹和所有者

/var/log/mysql/a/b/c
不存在<代码>/var/log/mysql/存在于原始“父”映像中

这可能是什么原因,以及如何强制创建具有所有者的
/var/log/mysql/a/b/c
目录树

这些文件夹的行为不一致。有时候不管用,有时候管用


为Ansible社区创建了一个社区。

我只是尝试复制,我这边的一切看起来都很好。根据您提供的Dockerfile示例构建图像后,容器内的情况如下所示:

sh-4.2# ls -la /var/log/mysql/a/b/c
total 8
drwxr-xr-x 2 mysql mysql 4096 Aug 24 14:37 . <-- the current directory (/var/log/mysql/a/b/c) has the mysql owner and group(if there would have been children entities in this directory, their owner would have also been changed because of the -R option you used.
drwxr-xr-x 3 root  root  4096 Aug 24 14:37 .. <-- the parent directory (/var/log/mysql/a/b) is owned by root, hence the mkdir -p was executed as root
生成命令:

docker image build -t so-weird-chown .
在容器中打开控制台并检查所有权:

docker run -it so-weird-chown sh
[Entrypoint] MySQL Docker Image 8.0.21-1.1.17


sh-4.2# ls -la /home/mysql/logs
total 8
drwxr-xr-x 2 mysql mysql 4096 Aug 24 16:35 .
drwxr-xr-x 4 root  root  4096 Aug 24 16:35 ..
sh-4.2# ls -la /home/mysql/lib
total 8
drwxr-xr-x 2 mysql mysql 4096 Aug 24 16:35 .
drwxr-xr-x 4 root  root  4096 Aug 24 16:35 ..

您使用的是哪个mysql_版本?我用了8.0.21。我不使用Dockerfile中的任何卷。我通过Ansile docker_图像模块运行它。也许它会有影响。我只是尝试在没有版本的情况下构建它,而且它也起了作用。8.0.21最新版本(mysql/mysql服务器:8.0.21-1.1.17)似乎有一个bug。我现在正在用8.0.21重建它无法获得它,但它现在和8.0.21一起工作。(不确定1.1.17,在哪里可以看到它)。真奇怪。但感谢您的调查和时间是的,您是对的:8.0.21中发生了一些奇怪的事情。我在8.0.21中遇到了同样的问题
sh-4.2#cd var/log/mysql/a/b/c sh:cd:var/log/mysql/a/b/c:没有这样的文件或目录
docker run -it so-weird-chown sh
[Entrypoint] MySQL Docker Image 8.0.21-1.1.17


sh-4.2# ls -la /home/mysql/logs
total 8
drwxr-xr-x 2 mysql mysql 4096 Aug 24 16:35 .
drwxr-xr-x 4 root  root  4096 Aug 24 16:35 ..
sh-4.2# ls -la /home/mysql/lib
total 8
drwxr-xr-x 2 mysql mysql 4096 Aug 24 16:35 .
drwxr-xr-x 4 root  root  4096 Aug 24 16:35 ..