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