据我了解,我应该能够在创建容器时通过我的 Dockerfile 将其复制到 /docker-entrypoint-initdb.d 目录来运行 shell 脚本。
我遇到的问题是运行 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 的文件。令人困惑的是,我能够从 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
图像的入口点脚本包含以下片段
mysql
:因此,当它运行脚本时,如果用户尚未以其他用户身份启动容器,
/docker-entrypoint-initdb.d
它就会以用户身份运行。mysql
原则上,您可以通过更改目录的所有权来解决这个问题
但是,关于目录的重要一点
/docker-entrypoint-initdb.d
是,它仅在容器第一次在给定的 MySQL 数据卷上运行时运行。如果卷已初始化,则入口点设置脚本将不会运行。如果您运行容器两次,您的文件将不会在第二次出现还要记住,容器只运行一个进程,很难从其他地方访问容器的文件系统。无论此脚本创建什么文件,您实际上都可能无法访问或使用它们。