在 Docker 入口点内运行 Shell 脚本的权限问题

问题描述 投票:0回答:1

据我了解,我应该能够在创建容器时运行 shell 脚本,方法是通过 Dockerfile 将其复制到 /docker-entrypoint-initdb.d 目录。

我遇到的问题是运行 docker compose up 后,收到以下错误 -

mysql_container-1  | 2024-12-16 21:14:21+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/shell.sh                                                     
mysql_container-1  | touch: cannot touch '/mysql_server/test': Permission denied

我原本期望 shell 脚本运行并创建一个名为 test.txt 的文件。令人困惑的是,我已经能够从我的 Dockerfile 中删除这个脚本并执行到容器中并触摸文件而不会出现问题。 我还尝试将

RUN ["chmod", "u+x", "/docker-entrypoint-initdb.d/shell.sh"]
添加到我的 Dockerfile 中,但没有成功。请参阅下面我的 docker-compose.yml、Dockerfile 和 shell.sh 文件。

TIA 对此提供任何帮助或指导。

Dockerfile:

FROM mysql:lts
WORKDIR /mysql_server

COPY shell.sh /docker-entrypoint-initdb.d
RUN ["chmod", "u+x", "/docker-entrypoint-initdb.d/shell.sh"]

docker-compose.yml:

services:
  mysql_container:
    image: mysql_image:Dockerfile
    build: 
      context: .
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=docker_db

shell.sh:

#!/bin/sh
touch /mysql_server/test
docker shell dockerfile permission-denied
1个回答
0
投票

mysql
图像入口点脚本包含以下片段:

# If container is started as root user, restart as dedicated mysql user
if [ "$(id -u)" = "0" ]; then
    mysql_note "Switching to dedicated user 'mysql'"
    exec gosu mysql "$BASH_SOURCE" "$@"
fi

因此,当它运行

/docker-entrypoint-initdb.d
中的脚本时,如果该用户尚未以其他用户身份启动容器,则它会以
mysql
用户的身份运行。

原则上您可以通过更改目录的所有者来匹配来解决此问题

# In the Dockerfile
RUN chown mysql /mysql_server

但是,

/docker-entrypoint-initdb.d
目录的重要之处在于,它仅在容器第一次在给定的 MySQL 数据卷上运行时运行。 如果卷已初始化,则入口点设置脚本将不会运行。 如果您运行容器两次,您的文件第二次将不会存在

docker volume create mysql_data
docker run -v mysql_data:/var/lib/mysql mysql_image:Dockerfile ls -l
docker run -v mysql_data:/var/lib/mysql mysql_image:Dockerfile ls -l

还请记住,容器仅运行单个进程,并且很难从其他地方访问容器的文件系统。 无论该脚本创建什么文件,您在实际访问或使用它们时都可能会遇到困难。

© www.soinside.com 2019 - 2024. All rights reserved.