gpt4 book ai didi

docker - 在构建时从 docker 访问已安装的卷以进行 composer/npm 安装?

转载 作者:行者123 更新时间:2023-12-02 19:28:27 25 4
gpt4 key购买 nike

我正在寻找一个更好的解决方案来在通过 docker-compose 安装的主机卷内安装 composer 或 npm 包。

在我的 docker-compose.yml 中,我有:

volumes:
- ./app:/var/www/app
...

在我的 dockerfile 中,我想使用这个卷来安装东西:
VOLUME ["/var/www/app"]
RUN composer install -d /var/www/app

但据我了解,当从 dockerfile 构建容器时,安装在 docker-compose 中的卷尚不可用。

所以我的下一次尝试是在容器启动时这样做:
CMD bash -c "composer install -d /var/www/app && /usr/sbin/apache2ctl -DFOREGROUND"

这至少有效,但每次运行容器时都会调用 composer install ,这是多余的。

所以我目前的想法是使用一个专用的composer镜像,将composer.json挂载到里面进行安装,然后将完成的vendor从composer容器的某处复制到容器中,并链接到需要的地方。像这样:
FROM composer as composer
COPY ./app/composer.json /app
COPY ./app/composer.lock /app
RUN composer install --ignore-platform-reqs --no-scripts

FROM library/ubuntu:jessie
# ... do other stuff with the main image ...

COPY --from=composer /app/vendor /var/www/composer/vendor
CMD bash -c "ln -s /var/www/composer/vendor /var/www/app/vendor && /usr/sbin/apache2ctl -DFOREGROUND"

但是对于这样一个普通的问题,它仍然感觉有点解决方法。有没有更好的方法来解决这个问题或任何已知的良好做法?

最佳答案

我认为最佳实践以及我的专业做法是在这种情况下根本不使用卷。我的 Dockerfile COPY s 在构建时的应用程序代码中。我有一个工作主机开发设置(唯一真正的主机依赖是 Node 本身;其他所有内容都在 node_modules 目录中),所以如果我有问题,我可以在本地环境中重现、调试和编写测试.只有当它有效时,我才会回到 Docker。

FROM ???
WORKDIR /var/www/app
COPY app/composer.json app/composer.lock ./
RUN composer install --ignore-platform-reqs --no-scripts
COPY app/ ./
...
CMD ["apache2ctl", "-DFOREGROUND"]

否则,这里需要记住一些关于 Docker 卷的事情:
  • Dockerfile 中的所有内容都发生在 docker-compose.yml 中的任何卷或环境变量之前。文件甚至被考虑。如果您的目标是填充卷,则不能在 Dockerfile 中完成(这在 Docker 中通常很尴尬;请改用 native 主机工具)。
  • 如果将卷挂载到容器目录中,它会完全隐藏已经存在的内容。我看到很多关于 Dockerfile 的问题,这些问题只能在本地容器内工作 /app目录,然后在该目录上绑定(bind)安装本地源代码树;这基本上使 Dockerfile 成为空操作。
  • 如果您有 VOLUME Dockerfile 中的指令,您不能再对镜像中的该目录进行任何更改。 (在您的问题中,在 composer 指令之后运行 VOLUME 将静默无效。)
  • 无论它是否被声明为 VOLUME,您都可以将卷挂载到容器中的任何目录中。 .我建议永远不要声明 VOLUME s 在 Dockerfiles 中,尤其是对于包含代码的目录(您希望在删除和重新创建容器时使用新的图像代码更新这些目录)。
  • 关于docker - 在构建时从 docker 访问已安装的卷以进行 composer/npm 安装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998567/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com