【问题标题】:Symlink to volume in Docker containerDocker容器中卷的符号链接
【发布时间】:2015-10-08 15:52:08
【问题描述】:

我创建了一个小型应用程序的 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 存储桶)挂载一个目录仅在生产中,因为我在开发和登台中不需要它,但我确实需要它在生产环境中保持容器和机器之间(我通过 AWS Elastic Beanstalk 进行部署)。

我尝试将主机目录直接挂载到/app/src/dir/,但我发现我无法更改目录的所有者和组以允许应用程序从中读取(Web 服务器不以 root 身份运行)。

【问题讨论】:

  • 我严重怀疑您是否可以在构建时创建指向卷的符号链接。不过,如果您将 ln -s 放在 CMD 或 ENTRYPOINT 脚本中,我希望它会起作用。
  • 在这种情况下,直接将源目录公开为卷会更聪明吗?
  • 我不太明白你想要达到什么目的。我认为您不了解卷的工作原理:docs.docker.com/userguide/dockervolumescontainer-solutions.com/understanding-volumes-docker
  • 感谢您的链接,他们提供了帮助。我正在尝试在容器中安装 S3 存储桶。我会用一些细节更新我的问题。
  • 你是问如何设置目录的权限吗?这很简单,像docker run -u root -v HOST_DIR:/tmp php:5.6-apache chown USER /tmp 这样的东西应该可以工作。

标签: docker symlink mount


【解决方案1】:

查看s6-overlay 项目,它允许您在容器启动时运行初始化脚本。允许您在启动服务之前在 s3 中挂载目录。它还允许您在 docker stop 上取消初始化服务,以便通知任何其他服务该服务正在关闭并获取任何僵尸进程。

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多