防止访问 docker 容器内的代码

Dim*_*e M 6 production-environment docker dockerfile

我想构建一个可供客户使用的生产就绪映像,我想知道是否有办法阻止访问映像中的代码?

我当前的方法是将我的代码存储在/root/并创建一个“客户”用户,该用户在其主目录中仅具有启动脚本。

我的 Dockerfile 看起来像这样

FROM node:8.11.3-alpine

# Tools
RUN apk update && apk add alpine-sdk

# Create customer user
RUN adduser -s /bin/ash -D customer

# Add code
COPY ./code /root/code
COPY ./start.sh /home/customer/

# Set execution permissions
RUN chown root:root /home/customer/start.sh
RUN chmod 4755 /home/customer/start.sh

# Allow customer to execute start.sh
RUN echo 'customer    ALL=(ALL) NOPASSWD: /home/customer/start.sh' | EDITOR='tee -a' visudo

# Default to use customer
USER customer

ENTRYPOINT ["sudo","/home/customer/start.sh"]
Run Code Online (Sandbox Code Playgroud)

这种方法按预期工作,如果我进入容器,我将无法看到代码库,但可以启动服务。

我的 Dockerfile 中的最后一步是为 root 用户设置密码或完全删除它。

我想知道这是否是正确的生产流程,或者我是否尝试使用 docker 来做一些不该做的事情?

如果这是正确的,我还应该锁定哪些其他东西?

任何提示表示赞赏!

Dav*_*aze 8

任何拥有你形象的人都可以做到

docker run -u root imagename sh
Run Code Online (Sandbox Code Playgroud)

任何可以运行 Docker 命令的人都拥有其系统的 root 访问权限(或者可以通过 简单地将其授予自己docker run -v /etc:/hostetc ...),因此可以自由地查看/var/lib/docker那里有什么。如果以系统特定的方式分散在目录中,它将包含所有图像的所有内容。

如果您的源代码实际上是秘密的,您应该确保您使用的是编译语言(C、Go、Java 之类),并且您的构建过程不会意外地将源代码泄漏到构建的映像中,并且它会与向最终用户分发二进制文件的任何其他内容一样安全。如果您使用脚本语言(Python、JavaScript、Ruby),那么最终用户本质上必须拥有能够运行程序的代码。