我在互联网上阅读了很多关于如何将本地(项目)目录最好地安装到Docker容器中的线程,以便这些目录不归root
用户所有。不幸的是,我没有找到准确的答案。
我正在使用此docker-compose.yml
(SfDocker)文件构建我的开发堆栈:
db:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: symfonyrootpass
MYSQL_DATABASE: symfony
MYSQL_USER: symfony
MYSQL_PASSWORD: symfonypass
worker:
image: symfony/worker-dev
ports:
- "8080:80"
environment:
XDEBUG_HOST: 192.168.1.194
XDEBUG_PORT: 9000
XDEBUG_REMOTE_MODE: req
links:
- db
volumes:
- "var/nginx/:/var/log/nginx"
- symfony-code:/var/www/app
仅在构建映像后才在运行时装入卷。我在RUN groupadd -r luqo33 && useradd -r -g luqo33 luqo33
图片中添加了symfony/worker-dev
新用户,但我无法chmod
已装入的卷,因此它归luqo33:www-data
所有。我试过这样做:
使用entrypoint.sh
命令复制并运行chmod
:
COPY entrypoint.sh /entrypoint.sh 运行chmod + x /entrypoint.sh ENTRYPOINT [“/ entrypoint.sh”]
容器会在没有明显原因的情况下启动然后关闭。
CMD chown -R luqo33:www-data
- 这可能无法正常工作,因为在启动worker-dev
容器时,卷似乎尚未安装。我没有设法将已安装目录的所有权设置为root
以外的用户。我怎样才能做到这一点?
答案 0 :(得分:1)
您似乎对Docker的工作方式感到有些困惑,特别是在入口点和cmd脚本方面。
ENTRYPOINT或CMD指令中引用的任何脚本都将在运行时由容器执行。脚本完成后,容器将退出。因此,您需要运行chmod并在脚本中启动应用程序。
如果当前用户是root用户,则以下脚本可以正常设置权限并启动应用程序:
#!/bin/bash
chown -R luqo33:www-data /var/www/app
sudo -u luqo33 exec start-my-app-in-foreground-script-or-bin
但是,sudo创建两个进程时会出现轻微问题,因此您可能希望使用gosu。