[docker] volume 补充 环境变量 参数

[docker] volume 补充 & 环境变量 & 参数

这里补充一下 volume 剩下的内容,以及添加参数(ARG) 和 环境变量 ENV 的内容

read only volumes

docker run
    -p 3000:80
    --rm
    --name feedback-app
    -v feedback:/app/feedback
    -v "$(pwd):/app"
    -v /app/node_modules
    feedback-node:volumes

这是上一篇笔记里用到的指令,并且提到了 docker 管理的容器和 host 上的文件会进行同步,但是本机的文件夹不会受到影响,这里进行一下补充为什么:

  • -v feedback:/app/feedback

    这里创造了一个 named volume,名称为 feedback

    • 所有在 container 中的变化会被持久到这个 volume 里

    • 这个 volume 也会被所有有这个指令的 container 共享

  • -v "$(pwd):/app"

    这里将 host machine——也就是 current working directory 和 <docker_container>/app 中进行了挂载(mounting),这代表当前的文件夹会会覆盖 container 里的内容

    当前 $(pwd) 中不存在 node_module,所以 container 里的 node_module 会被 shadowed/hidden

    这同样存在一个问题,那就是任何在 container 中发生的变化,实际上是会被同步到 host machine 上的

    也就是说,temp 的内容可能会出现在 host machine 上:

    在这里插入图片描述

  • -v /app/node_modules

    这是为了解决 node_module 被隐藏而使用的解决方案

    这样 node_module 完全由容器进行管理,就不会被隐藏掉

想要设置当前的 host machine 为只读模式——即 docker 无法写入 host machine,可以使用 :ro 这个 flag:

docker run
    -p 3000:80
    -d
    --rm
    --name feedback-app
    -v feedback:/app/feedback
    -v "$(pwd):/app:ro"
    -v /app/node_modules feedback-node:volumes

这个情况下,$(pwd} 就是只读模式了,不过这里还会有一个问题,那就是如果文件夹——如 node_module 不存在,docker 为了保证二者的同步,又没有 $(pwd} 的写的权利,就会报错,这个是已知问题,可以在 GitHub 上的 issue 查看:Mounting subdirectories of a host volume as named or anonymous volumes still mounts them as host volumes

目前除了添加 .gitkeep 去维持一个空的文件夹,保证 host machine 和 container 中的内容结构一致外,没有什么特别好的解决方案。

管理 volume

查看 volume 可以用 docker volume ls

docker volume ls
DRIVER    VOLUME NAME
local     3e12e9ad9bb9ea262e16e30ff1953138952428544437dcc859058c23b26947ef
local     417ec38d03c862da140a876341fe02adb0aebdd352ca31799d3dd56da43b5b62
local     a994aa8010d2b8ae7b7d2f973ee843cfae46736f1c8d6823b8d0775d01d988e1
local     feedback

之前也提到了,如果用 docker run --rm 会自动删除 anonymous volume,不用的话可能会出现 Orphaned Volumes,出现这种情况可以用 docker volume rm 或者 docker volume prune 去进行清理

另外两个比较少用的功能有 createinspect,前者可以用来创建一个新的 volume:

docker volume create --help

Usage:  docker volume create [OPTIONS] [VOLUME]

Create a volume

Options:
  -d, --driver string   Specify volume driver name (default "local")
      --label list      Set metadata for a volume
  -o, --opt map         Set driver specific options (default map[])

后者可以查看 volume 的细节:

docker volume inspect feedback
[
    {
        "CreatedAt": "2024-04-20T15:04:58Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/feedback/_data",
        "Name": "feedback",
        "Options": null,
        "Scope": "local"
    }
]

这里查看的是 anonymous volume:

docker volume inspect b3ed4fe45866f3b5527f36d8cd53d7cbb5096be73494a604dbab5f72a8cd603f
[
    {
        "CreatedAt": "2024-04-20T20:40:02Z",
        "Driver": "local",
        "Labels": {
            "com.docker.volume.anonymous": ""
        },
        "Mountpoint": "/var/lib/docker/volumes/b3ed4fe45866f3b5527f36d8cd53d7cbb5096be73494a604dbab5f72a8cd603f/_data",
        "Name": "b3ed4fe45866f3b5527f36d8cd53d7cbb5096be73494a604dbab5f72a8cd603f",
        "Options": null,
        "Scope": "local"
    }
]

一般最常用的还是 prune 去清理所有没有再被使用的 volume

COPY vs Bind Mounts

简单来说,在开发阶段如果使用了 Bind Mounts,那么 COPY 可以被忽略

但是生产环境肯定是要使用 COPY

dockerignore

类似于 .gitignore

在这里插入图片描述

实现方式也和 .gitignore 类似:

node_modules

一般比较常添加的忽略文件有: node_modules, .git, Dockerfile

除了 Dockerfile.git,大多数情况下也就是 .gitignore 经常忽略的文件

环境变量(env variable)

环境变量可以在 Dockerfile 中和代码中被访问到,可以使用两种方式设置:

  • 写入 Dockerfile
  • 在运行 docker run 时添加 --env

Dockerfile 配置

这里是 server.js 部分:

// 如果环境中有存在一个 PORT 的变量,那么使用 PORT
app.listen(process.env.PORT ?? 80);

这里是 Dockerfile 的修改:

ENV PORT 80

# $ indicate it's a variable
EXPOSE $PORT

docker run

docker run
    -p 3000:8000
    --env PORT=8000
    -d
    --rm
    --name feedback-app
    -v feedback:/app/feedback
    -v "$(pwd):/app"
    -v /app/node_modules
    feedback-node:volumes

649caeddc7df378188c5df5e5c1ac3389f5631d868b933a69ac9253918e6e063
❯ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                            NAMES
649caeddc7df   feedback-node:volumes   "docker-entrypoint.s…"   4 seconds ago   Up 4 seconds   80/tcp, 0.0.0.0:3000->8000/tcp   feedback-app
❯ docker port feedback-app
8000/tcp -> 0.0.0.0:3000

docker run 的优先权更高,会重写 Dockerfile 中的值,所以这时候 port mapping 的端口是 0.0.0.0:3000->8000/tcp

.env 配置

使用 nodejs 比较常见的配置方法用的是 .env,如:

PORT=8000

这时候可以使用 --env-file ./.env 这个参数去运行:

docker run -p 3000:8000 --env-file ./.env -d --rm --name feedback-app -v feedback:/app/feedback -v "$(pwd):/app" -v /app/node_modules feedback-node:volumes
9270cc97c71b18bd0b22349296e199bb402ec0d3e3cc2cee4d6bc13d4e06a488
❯ docker port feedback-app
8000/tcp -> 0.0.0.0:3000

使用 env 的安全性

一般来说不建议使用环境变量保存一些敏感信息,比如说 API key,原因是因为使用环境变量 ENV 会单独生成一个只读 layer,换言之当前的值会保存在 docker image 中。

如下面使用 docker history 去查看 image 的历史:

docker history feedback-node:volumes
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
6072de71477f   7 minutes ago   CMD ["npm" "start"]                             0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   ENV PORT=80                                     0B        buildkit.dockerfile.v0
<missing>      7 minutes ago   COPY . . # buildkit                             10.1kB    buildkit.dockerfile.v0
<missing>      4 days ago      RUN /bin/sh -c npm install # buildkit           12.6MB    buildkit.dockerfile.v0
<missing>      4 days ago      COPY package.json /app # buildkit               364B      buildkit.dockerfile.v0
<missing>      6 days ago      WORKDIR /app                                    0B        buildkit.dockerfile.v0
<missing>      9 days ago      /bin/sh -c #(nop)  CMD ["node"]                 0B
<missing>      9 days ago      /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>      9 days ago      /bin/sh -c #(nop) COPY file:4d192565a7220e13…   388B
<missing>      9 days ago      /bin/sh -c set -ex   && export GNUPGHOME="$(…   7.58MB
<missing>      9 days ago      /bin/sh -c #(nop)  ENV YARN_VERSION=1.22.19     0B
<missing>      9 days ago      /bin/sh -c ARCH= && dpkgArch="$(dpkg --print…   165MB
<missing>      9 days ago      /bin/sh -c #(nop)  ENV NODE_VERSION=21.7.3      0B
<missing>      10 days ago     /bin/sh -c groupadd --gid 1000 node   && use…   8.94kB
<missing>      10 days ago     /bin/sh -c set -ex;  apt-get update;  apt-ge…   587MB
<missing>      10 days ago     /bin/sh -c set -eux;  apt-get update;  apt-g…   177MB
<missing>      10 days ago     /bin/sh -c set -eux;  apt-get update;  apt-g…   48.4MB
<missing>      10 days ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      10 days ago     /bin/sh -c #(nop) ADD file:ca6d1f0f80dd6c91b…   117MB

可以看到 <missing> 7 minutes ago ENV PORT=80 这一段。

如果将关键信息存到 ENV中,任何拿到这个 image 的人都可以通过 docker history 去查看当前镜像的历史,从而获取关键信息的值。

参数(ARG)

ARG 只能在 Dockerfile 中使用,无法在 cmd 或是代码中获取 Dockerfile 中设立的 ARG

使用 ARG 不会单独留存一个 layer,因此不会将关键信息留存到 docker image 中,如下面的修改:

ARG DEFAULT_PORT=80

ENV PORT ${DEFAULT_PORT}

EXPOSE $PORT

或者是使用命令行运行:

docker build -t feedback-node:volumes --build-arg DEFAULT_PORT=5000 .docker history feedback-node:volumes
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
eedbc88d6560   16 seconds ago   CMD ["npm" "start"]                             0B        buildkit.dockerfile.v0
<missing>      16 seconds ago   EXPOSE map[5000/tcp:{}]                         0B        buildkit.dockerfile.v0
<missing>      16 seconds ago   ENV PORT=5000                                   0B        buildkit.dockerfile.v0
<missing>      16 seconds ago   COPY . . # buildkit                             10.2kB    buildkit.dockerfile.v0
<missing>      16 seconds ago   RUN |1 DEFAULT_PORT=5000 /bin/sh -c npm inst…   12.6MB    buildkit.dockerfile.v0
<missing>      4 days ago       COPY package.json /app # buildkit               364B      buildkit.dockerfile.v0
<missing>      6 days ago       WORKDIR /app                                    0B        buildkit.dockerfile.v0
<missing>      6 days ago       ARG DEFAULT_PORT=80                             0B        buildkit.dockerfile.v0
<missing>      9 days ago       /bin/sh -c #(nop)  CMD ["node"]                 0B
<missing>      9 days ago       /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>      9 days ago       /bin/sh -c #(nop) COPY file:4d192565a7220e13…   388B
<missing>      9 days ago       /bin/sh -c set -ex   && export GNUPGHOME="$(…   7.58MB
<missing>      9 days ago       /bin/sh -c #(nop)  ENV YARN_VERSION=1.22.19     0B
<missing>      9 days ago       /bin/sh -c ARCH= && dpkgArch="$(dpkg --print…   165MB
<missing>      9 days ago       /bin/sh -c #(nop)  ENV NODE_VERSION=21.7.3      0B
<missing>      10 days ago      /bin/sh -c groupadd --gid 1000 node   && use…   8.94kB
<missing>      10 days ago      /bin/sh -c set -ex;  apt-get update;  apt-ge…   587MB
<missing>      10 days ago      /bin/sh -c set -eux;  apt-get update;  apt-g…   177MB
<missing>      10 days ago      /bin/sh -c set -eux;  apt-get update;  apt-g…   48.4MB
<missing>      10 days ago      /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      10 days ago      /bin/sh -c #(nop) ADD file:ca6d1f0f80dd6c91b…   117MB

可以看到, ARG 并没有出现在 docker history

另外, ARG 只能在 image 被建造时访问,换言之,在运行时,也就是执行到 CMD这一段, ARG 是无法被访问到的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第 394 场 LeetCode 周赛题解

A 统计特殊字母的数量 I 哈希&#xff1a;遍历然后枚举 class Solution {public:int numberOfSpecialChars(string word) {unordered_map<char, int> m;for (auto ch : word)m[ch] 1;int res 0;for (char ch a; ch < z; ch)if (m.count(ch) && m.count(A …

爬虫采集:数据提取

目录 1. 数据分类 2. JSON 2.1 json数据转换​编辑 3. 正则表达式 3.1 re模块 3.1.1 常见方法 3.1.2 单字符匹配 3.1.4 匹配开头和结尾 3.1.5 分组匹配 3.1.6 贪婪非贪婪匹配 4. Xpath 4.1 语法 4.2 查找特定节点 4.3 lxml 模块 4.3.1 安装 4.3.2 导入 4.3.3 使…

【行为型模式】命令模式

一、命令模式概述 命令模式的定义&#xff1a;将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(对象行为型) 命令模式优缺点&#xff1a; 优点&#xff1a; 1.类间解耦&#xff1a;调用者角色与接收者角色之间没有任何依…

TPG原理以及verilog实现

文章目录 一、前言二、verilog代码实现三、仿真以及结果分析 一、前言 TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据&#xff0c;对视频数据通路测试。根据视频输出时序产生相应的图像数据 二、verilog代码实现 timescale 1ns / 1nsmodule tpg ( i…

鸿蒙入门10-CheckBoxGroup组件

复选框群组 用于控制多个复选框全选或者不全选状态 参数 参数形式 &#xff1a; CheckboxGroup( options?: { group?: string } ) 创建复选框群组&#xff0c;可以用于控制群组内的 CheckBox 成员 全选 或者 不全选 相同 group 的 CheckBox 和 CheckBoxGroup 为同一群组 参…

Python turtle海龟绘制美国队长盾牌

使用Python中的turtle模块绘制美队盾牌 具体思路如下&#xff1a; 导入海龟库第1个圆&#xff1a;半径 200&#xff0c;红色填充第2个圆&#xff1a;半径 150&#xff0c;白色填充第3个圆&#xff1a;半径 100&#xff0c;红色填充第4个圆&#xff1a;半径 50&#xff0c;蓝色…

摩科智能协办“提高不动产登记质量,促进优化营商环境培训会”

为深入落实国家和自治区自然资源工作会议精神&#xff0c;加强不动产登记队伍作风常态化建设&#xff0c;提高不动产登记质量&#xff0c;促进优化营商环境&#xff0c;学习先进地区工作经验。2024年4月19日&#xff0c;“提高不动产登记质量 促进优化营商环境培训会”在浙江省…

在PostgreSQL中如何实现分区表以提高查询效率和管理大型表?

文章目录 解决方案1. 确定分区键2. 创建分区表3. 数据插入与查询4. 维护与管理 示例代码1. 创建父表和子表2. 插入数据3. 查询数据 总结 随着数据量的增长&#xff0c;单一的大型表可能会遇到性能瓶颈和管理难题。PostgreSQL的分区表功能允许我们将一个大型表分割成多个较小的、…

windows驱动开发-内存概述

“90%的程序问题都是由内存引起的&#xff0c;剩下的10%是使用内存引起的&#xff01;”这是一句非常经典的论证&#xff0c;实际上&#xff0c;在程序开发中&#xff0c;内存问题就是最大的问题&#xff0c;没有之一。 现代的计算机体系中&#xff0c;内存承载了太多的功能&a…

HttpServlet,ServletContext,Listener它仨的故事

1.HttpServlet。 听起来是不是感觉像是个上古词汇&#xff0c;是不是没有阅读下去的兴趣了&#xff1f;Tomcat知道吧&#xff0c;它就是一个servlet容器&#xff0c;当用户向服务器发送一个HTTP请求时&#xff0c;Servlet容器&#xff08;如Tomcat&#xff09;会根据其配置找到…

Vue项目实现懒加载——自用笔记

熟悉指令语法&#xff1a; <template><HomePanel title"人气推荐" sub-title"人气爆款 不容错过"><ul class"goods-list"><li v-for"item in hotList" :key"item.id"><RouterLink to"/&qu…

嵌入式Linux开发

(17 封私信 / 1 条消息) 嵌入式Linux应用 - 搜索结果 - 知乎 (zhihu.com)

【面试】输出设备-①-Tableau入门

感谢大佬 举个栗子&#xff01;Tableau 技巧&#xff08;266&#xff09;&#xff1a;学做双向圆角条形图-CSDN博客 感谢W3Cschool Tableau 概述_w3cschool 感谢Tableau 官方社区 Discover | Tableau Public 1.目标和计划 近期公司需要进行数据大屏的制作&#xff0c;调研了一下…

【大语言模型LLM】-大语言模型乐园,高效办公不迷路!

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 ❤️感谢大家点赞&#x1f44d; 收藏⭐ 评论⭐ &#x1f3a5;大语言模型LLM基础-系列文章&#xff1a; 【大语言模型LLM】-大语言模型如何编写Prompt? 【大语言模型LLM】-如何…

Pytorch第一部分数据模块

数据划分&#xff1a; 从数据集中将数据划分为训练集&#xff0c;测试集&#xff0c;验证集 # -*- coding: utf-8 -*- """ # file name : 1_split_dataset.py # author : tingsongyu # date : 2019-09-07 10:08:00 # brief : 将数据集划分为训…

Gamba:将高斯溅射与Mamba结合用于单视图3D重建

Gamba: Marry Gaussian Splatting with Mamba for Single-View 3D Reconstruction Gamba&#xff1a;将高斯溅射与Mamba结合用于单视图3D重建 Qiuhong Shen11  Xuanyu Yi31 Zike Wu31  Pan Zhou2,42 Hanwang Zhang3,5 沈秋红 1 易轩宇 3 吴子可 3 潘周 2,4 2 张汉旺 3,5Shu…

验证线缆(汽车线束、网线、多芯线)破损或断开与正常线缆的区别在哪里?依AEM CV-100 k50测试仪

工厂产线生产的线缆&#xff08;汽车线束、网线、多芯线&#xff09;做成成品&#xff0c;即2端都安装好了模块。在这种情况下如何快速的判定此条线缆是合格的呢&#xff0c;此处的合格为物理层面上的合格&#xff08;不会出现开路、短路&#xff09;&#xff0c;也就是最基本保…

【LAMMPS学习】八、基础知识(3.9)输出结构化数据

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

android开发 多进程的基本了解

目录 如何开启多进程?理解多进程模式的运行机制 如何开启多进程? 给四大组件在androidMenifest中指定android:precess <activityandroid:name".ThreeActivity"android:exported"false"android:process"com.my.process.three.remote" />…

冒泡排序c++

题目描述 编程输入n(1≤n≤20)个小于1000非负整数&#xff0c;然后自动按从大到小的顺序输出。&#xff08;冒泡排序&#xff09; 输入 第一行&#xff0c;数的个数n; 第二行&#xff0c;n个非负整数。 输出 由大到小的n个非负整数&#xff0c;每个数占一行。 样例输入 …