运行 docker 容器内不受信任的 .net 核心应用程序的最佳实践
Best practice for running a non trusted .net core application inside a docker container
假设我想在 docker 容器中 运行 某些我不完全信任的第三方 .net 核心应用程序。
- 为简化起见,我们假设应用程序是由
dotnet new
生成的简单 Hello World 控制台应用程序。这只是 2 个文件 Program.cs 和 project.json.
现在我尝试了以下方法:
- 将该应用程序复制到我主机的某个文件夹中
使用 microsoft/dotnet 图像创建一个新容器,将该文件夹安装为一个卷,运行使用特定命令来构建和 运行使用应用程序:
$ docker run --rm -it --name dotnet \
-v /some/temp/folder/app:/app \
microsoft/dotnet:latest \
/bin/sh -c 'cd /app && dotnet restore && dotnet run'
我也在考虑使用预定义 docker 文件的想法,其中 microsoft/dotnet 作为基本图像。它基本上会嵌入应用程序代码,将其设置为工作目录和 运行 恢复、构建和 运行 命令。
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
ENTRYPOINT ["dotnet", "run"]
然后我可以将预定义的 docker 文件复制到临时文件夹中,为该特定应用程序构建一个新图像,最后 运行 使用该图像的新容器。
docker文件方法对于简单的命令行应用程序来说是否过大? 运行宁那些不受信任的应用程序的最佳做法是什么?(我可能完全忽略了这一点)
编辑
因为我会在 运行s 之后丢弃容器并且 docker 命令将由某些应用程序生成,所以我可能会保留第一个选项,即只安装一个卷。
我也找到了this blog post where they built a similar sanbox environment and ended up following the same mounted volume approach
据我所知,docker 中发生的事情将保留在 docker 中。
当您 link 将卷 (-v) 添加到映像时,该过程可以更改您安装的文件夹中的文件。但仅限于此。该进程不能跟随任何 symlinks 或步出安装的文件夹,因为出于明显的安全原因它被禁止。
当你不link任何东西并将应用程序代码复制到图像中时,它绝对是隔离的。
tcp/udp 端口展示以及 memory/cpu 消耗由您决定,您甚至可以将进程与互联网隔离 e.g. like that
因此,我认为使用 dockerfile 并不过分,我总结如下:
当您想 运行 一次时,尝试一下然后忘记它 - 如果您可以输入令人讨厌的命令,请使用命令行。如果您打算更多地使用它 - 创建一个 Dockerfile。我认为 space 在这里声明 "best practice" 并不多,因为这是个人喜好问题。
假设我想在 docker 容器中 运行 某些我不完全信任的第三方 .net 核心应用程序。
- 为简化起见,我们假设应用程序是由
dotnet new
生成的简单 Hello World 控制台应用程序。这只是 2 个文件 Program.cs 和 project.json.
现在我尝试了以下方法:
- 将该应用程序复制到我主机的某个文件夹中
使用 microsoft/dotnet 图像创建一个新容器,将该文件夹安装为一个卷,运行使用特定命令来构建和 运行使用应用程序:
$ docker run --rm -it --name dotnet \ -v /some/temp/folder/app:/app \ microsoft/dotnet:latest \ /bin/sh -c 'cd /app && dotnet restore && dotnet run'
我也在考虑使用预定义 docker 文件的想法,其中 microsoft/dotnet 作为基本图像。它基本上会嵌入应用程序代码,将其设置为工作目录和 运行 恢复、构建和 运行 命令。
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
ENTRYPOINT ["dotnet", "run"]
然后我可以将预定义的 docker 文件复制到临时文件夹中,为该特定应用程序构建一个新图像,最后 运行 使用该图像的新容器。
docker文件方法对于简单的命令行应用程序来说是否过大? 运行宁那些不受信任的应用程序的最佳做法是什么?(我可能完全忽略了这一点)
编辑
因为我会在 运行s 之后丢弃容器并且 docker 命令将由某些应用程序生成,所以我可能会保留第一个选项,即只安装一个卷。
我也找到了this blog post where they built a similar sanbox environment and ended up following the same mounted volume approach
据我所知,docker 中发生的事情将保留在 docker 中。
当您 link 将卷 (-v) 添加到映像时,该过程可以更改您安装的文件夹中的文件。但仅限于此。该进程不能跟随任何 symlinks 或步出安装的文件夹,因为出于明显的安全原因它被禁止。
当你不link任何东西并将应用程序代码复制到图像中时,它绝对是隔离的。
tcp/udp 端口展示以及 memory/cpu 消耗由您决定,您甚至可以将进程与互联网隔离 e.g. like that
因此,我认为使用 dockerfile 并不过分,我总结如下:
当您想 运行 一次时,尝试一下然后忘记它 - 如果您可以输入令人讨厌的命令,请使用命令行。如果您打算更多地使用它 - 创建一个 Dockerfile。我认为 space 在这里声明 "best practice" 并不多,因为这是个人喜好问题。