我创建了一个 Docker 容器,一个小型应用程序,其中我有一个目录,我想根据环境替换(或不替换)其内容。我试图通过创建一个卷并仅将其安装在其他环境中来解决这个问题。在容器内,我正在从我的源目录创建一个指向该卷的符号链接(symbolic link)。
FROM php:5.6-apache
# Copy in sources files etc
# Ensure the directory exists and make a symlink to it
RUN mkdir -p /data/share \
&& rm -rf /app/src/dir \
&& ln -s /data/share /app/src/dir \
&& chown -hR appropriate:settings /app/src/dir
VOLUME ["/data/share"]
当我在开发中运行容器时,我根本没有在
/data/share
上安装任何东西,并且在生产中,我从主机挂载一个目录(这又是一个挂载的 S3 目录,以防有区别)。我发现
/data/share
目录已正确安装,但是我的符号链接(symbolic link)根本无法建立。运行docker exec -it <container_id> ls -la /app/src/
不会将目录显示为符号链接(symbolic link),也不会通过运行 bash 并检查目录来进入容器。在容器启动后手动创建符号链接(symbolic link)就可以了。在容器构建和/或运行期间创建符号链接(symbolic link)时,我是否需要做一些不同的事情?
更新细节
我正在尝试仅在生产中从容器中的主机(已安装的 S3 存储桶)挂载一个目录,因为我在开发和登台中不需要它,但我确实需要它在容器和机器之间持久存在(我是通过 AWS Elastic Beanstalk 部署)在生产中。
我尝试将主机目录直接挂载到
/app/src/dir/
,但我发现我无法更改目录的所有者和组以允许应用程序从中读取(Web 服务器不以 root 身份运行)。
最佳答案
看s6-overlay允许您在容器启动时运行初始化脚本的项目。允许您在启动服务之前在 s3 中挂载目录。它还允许您在 docker stop
上取消初始化服务因此您可以通知任何其他服务服务正在关闭并获取任何僵尸进程。
关于docker - Docker容器中卷的符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31501004/