gpt4 book ai didi

docker - 分离 Docker 文件和应用程序源文件以优化生产环境

转载 作者:行者123 更新时间:2023-12-02 21:01:08 27 4
gpt4 key购买 nike

我有一堆(Ruby)脚本存储在服务器上。到目前为止,我的团队通过打开一个启动脚本名称列表的访问器应用程序来使用它们,然后他们在工作文件夹中的文件上选择要在该实例中运行的脚本。脚本直接从服务器运行,因此对脚本文件所做的更新会在用户运行脚本时自动反射(reflect)。

这些脚本需要相当多的特定依赖项,因此我正在尝试转向基于 Docker 的工作流程,以消除我们在不一致的计算机环境中遇到的问题。我已经能够使用我们的脚本库成功构建图像并在我的计算机上运行它的实例。

但是,所有文档和教程在构建镜像时都包含应用程序源文件,因此所有文件都由 Dockerfile 复制。据我了解,这意味着每当需要更新应用程序文件中的代码时,所有用户都需要在尝试运行任何内容之前重建镜像。我很少需要更改环境设置/依赖项,但是应用程序代码更改相对频繁,因此似乎让每个用户每次更改应用程序代码行时都重建图像实际上会减慢每个人的速度工作流程相当。

我的问题是:是否不可能让 Docker 简单地创建用户运行应用程序必须具备的环境,但让应用程序本身仍然直接在它们最初存储的服务器上运行?每次用户想要运行任何一个脚本时,是否都需要创建一个新容器? (用户不精通技术。)

最佳答案

通常,您会使用 Docker 镜像而不是 checkout 的脚本树来执行此操作。您可以使用 Docker 注册表将镜像的构建副本存储在网络上的某个位置; Docker Hub 适用于此,大多数大型公共(public)云提供商都有一些版本(AWS ECR、Google GCR、Azure ACR,...),或者您可以运行自己的。使用它的工作流程通常看起来像

# Get any updates to the "latest" version of the image
# (can be run infrequently)
docker pull ourorg/scripts

# Actually run the script, injecting config files and credentials
docker run --rm \
-v $PWD/config:/config \
-v $HOME/.ssh:/config/.ssh \
ourorg/scripts \
some_script.rb

# Nothing in this example actually requires a local copy of the scripts

我正在设想一个目录,其中包含脚本和支持文件的混合,而不是很多组织。不过,您可以编写一个简单的 Dockerfile,看起来像

FROM ruby:2.7
WORKDIR /opt/scripts

# As of Bundler 2.1, there is no compatibility between Bundler
# versions; this must match exactly what is in Gemfile.lock
RUN gem install bundler -v 2.1.4

# Copy the scripts in and do basic installation
COPY Gemfile Gemfile.lock .
RUN bundle install
COPY . .
ENV PATH /opt/scripts:$PATH

# Prefix all commands with...
ENTRYPOINT ["bundle", "exec"]

# The default command to run is...
CMD ["ls"]

在后端,您需要一个持续的集成服务(如果有点笨拙,Jenkins 很受欢迎;有大量的云托管服务可供选择),只要有对源存储库的提交,它就可以重建 Docker 镜像。您通常可以安装它,以便每当有人插入任何东西时它都会自动发生。

这个过程让大多数人只使用一组脚本而很少有人开发它们更有意义。发现脚本是什么也有点困难(你也许可以 docker run --rm ourorg/scripts ls)。

Is it not possible to have Docker simply create the environment that a user must have to run the applications, but have the applications themselves still run directly off the server where they were originally stored?



这总是让我觉得 Docker 的使用效率低下。您拥有当前工作流程的所有繁琐步骤,需要每个人都运行 git pull或等效的常规方法,但您还必须将主机源代码树注入(inject)容器。如果存在操作系统不兼容,例如 vendor 中的原生 gem树,你必须解决这个问题。

# You still need to do this periodically
git pull

# And you also need to
sudo docker run \
--rm \
-v $PWD:/app \
-v $HOME/config:/config \
-v $HOME/.ssh:/config/.ssh \
-w /app \
ruby:2.7 \
bundle exec ./some_script.rb

即使您确实构建了镜像,也必须处理其中一些细节(尤其是配置文件和凭据);您可以通过构建图像来改进其他一些细节。在图像中,您需要更正 ssh key 的所有权和权限并替换 $PWD/vendor树包含容器可以运行的东西,而无需修改已安装的主机目录。

关于docker - 分离 Docker 文件和应用程序源文件以优化生产环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60285803/

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