我已经在一个小应用程序中创建了一个Docker容器,其中我有一个目录,其内容我想要替换(或不替换),具体取决于环境。我试图通过创建一个卷并仅将其安装在其他环境中来解决这个问题。在容器内部,我正在从源目录创建卷的符号链接。
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
目录,但是我的符号链接无法建立。运行docker exec -it <container_id> ls -la /app/src/
不会将目录显示为符号链接,也不会通过运行bash并检查目录来进入容器内部。在容器启动后手动创建符号链接很好。
在容器构建和/或运行期间创建符号链接时,是否需要执行不同的操作?
更新详情
我正在尝试从主机(已安装的S3存储桶)中仅在生产中的容器中挂载一个目录,因为我在dev&amp; amp;中并不需要它。暂存,但我确实需要它在容器和机器之间(我通过AWS Elastic Beanstalk进行部署)在生产中持续存在。
我已经尝试将主机目录直接挂载到/app/src/dir/
,但我发现我无法更改目录的所有者和组以允许应用程序从中读取(Web服务器不以root身份运行。
答案 0 :(得分:0)
查看允许您在容器启动时运行初始化脚本的s6-overlay项目。允许您在启动服务之前在s3中安装目录。它还允许您在docker stop
上取消服务,以便您可以通知任何其他服务服务正在关闭并收获任何僵尸进程。