在 docker 容器中进行卷挂载时,有一个可选参数
--volume-driver string Optional volume driver for the container
这个参数有什么用?
为什么 Docker 将卷挂载为root
,而不是已运行命令的用户docker run
?这可以通过设置一些参数/参数等来改变吗?
MWE:
$ ls -la
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 22 18:09 shinylog
$ docker run -v $(pwd)/test_dir/:/home/ --name nginx -d nginx
bf340face11485a81ee7c208d490f11abbdc84089ffe9c01d71ffcf8b9ffc27d
$ ls -la
drwxr-xr-x 2 ubuntu ubuntu 4096 Aug 22 18:09 shinylog
drwxr-xr-x 2 root root 4096 Aug 22 18:33 test_dir
$ echo $USER
ubuntu
Run Code Online (Sandbox Code Playgroud)
编辑:安装 docker 后我遇到错误:
Got permission denied while trying to connect to the Docker
daemon socket at unix:///var/run/docker.sock: Get
http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial
unix /var/run/docker.sock: connect: permission …
Run Code Online (Sandbox Code Playgroud) 计划是将我的 dockerized 应用程序移至 Kubernetes。
docker 容器使用几个文件 - 我曾经通过在 docker-compose 文件中指定将它们挂载在 docker 卷上:
volumes:
- ./license.dat:/etc/sys0/license.dat
- ./config.json:/etc/sys0/config.json
Run Code Online (Sandbox Code Playgroud)
对于不同的环境,配置文件会有所不同,许可证文件也会相同。
如何在 helm 模板文件 (yaml) 中定义它以便它可用于正在运行的应用程序?
通常,最好的做法是什么?是否也可以在 values.yaml 中定义配置值并且 config.json 文件可以获得它?
我正在寻找某种方法将 S3 存储桶(例如)作为 Docker 卷安装在 Elastic Beanstalk Docker 容器中。
由于我无法更改应用程序代码,因此我必须使用 Docker 卷在 Dockerrun.aws.json 文件中配置该部分。
我需要为我的应用程序中的单个配置文件和一个文件目录挂载一个文件。
这是我的 Dockerrun.aws.json 文件。
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "app"
},
"Ports": [
{
"ContainerPort": 8080,
"HostPort" : 80
}
],
"environment": [
{
"name": "app_DB_MYSQL",
"value": ""
},
{
"name": "app_DB_USERNAME",
"value": "app"
},
{
"name": "app_DB_PASSWORD",
"value": ""
},
{
"name": "app_DB_DATABASE",
"value": "app"
}
],
"volumes": [
{
"HostDirectory": "files",
"containerPath": "/usr/src/app/files",
},
{
"HostDirectory": "configuration.yaml",
"containerPath": "/usr/src/app/config/configuration.yaml",
}
],
"Logging": "/var/log", …
Run Code Online (Sandbox Code Playgroud) persistent-storage amazon-web-services docker amazon-elastic-beanstalk docker-volume
在 docker 文档中,它说了以下内容:
docker volume prune
=== 删除所有未使用的本地卷
为了测试这一点,我使用 docker hub 的官方最新映像设置了一个 MongoDb 容器。这样做会在幕后创建 2 个卷,容器可能需要这些卷来存储数据。
现在运行时docker volume ls
,我可以看到两个具有随机名称的卷。
假设我有多个容器,其中的卷使用随机名称。现在很难知道其中哪些仍在使用,所以我希望docker volume prune
在这里提供帮助。
因此,我执行了该命令,希望docker volume prune
在我的容器启动并使用 MongoDb 运行时不会删除任何内容。但实际发生的情况是,我的所有卷都被删除了。之后我的容器关闭并且无法重新启动。
我多次尝试重新创建此命令,即使每次容器运行时,该命令也会删除所有卷。
任何人都可以解释这种行为吗?
更新:
使用 MongoDB 映像的容器 ID 执行以下命令会显示 2 个卷:
docker inspect -f '{{ .Mounts }}' *CONTAINER_ID*
Run Code Online (Sandbox Code Playgroud)
因此,根据我的理解,docker 知道这些卷和容器属于同一组。
当我要求 docker 显示悬空卷时,它再次显示相同的卷:
docker volume ls --filter dangling=true
Run Code Online (Sandbox Code Playgroud)
因此,当它们悬空时,修剪命令将它们删除对我来说是有意义的。但我显然有与我的容器一起使用的卷,所以我不清楚。
-V, --renew-anon-volumes Recreate anonymous volumes instead of retrieving
data from the previous containers.
Run Code Online (Sandbox Code Playgroud)
难道docker-compose up -V
不适用于命名卷?
我有一项服务,它在构建映像时从 SVN 中提取一些文件。然后它创建一个命名卷。我可以docker-compose build --no-cache
重新创建图像并从 SVN 中提取最新文件。但是音量不会在 上更新docker-compose up -V
,除非我事先将其删除。
我只想要一种干净简单的方法来更新命名卷中的文件
当然,我可以手动删除卷,然后运行所有内容,但我真的希望它是 compose 驱动的。这让我想到了第二个问题。
有一个docker-compose down -v
也将删除卷,但我无法针对单个服务(仅全部或全部)运行它。
因此,我需要以某种方式从 compose-file 中找出仅 1 个服务的命名卷,然后使用一些额外的命令 ( docker volume rm
?) 仅删除该卷。
以 root 权限运行ENTRYPOINT ["/bin/sh", entrypoint.sh"]
,然后在运行应用程序之前切换到非 root 用户,这是否被认为是一种安全的做法?
更多背景:
有许多文章(1、2、3 )建议以非 root 用户身份运行容器是安全性方面的最佳实践。这可以使用命令来实现,但是在某些情况下(4、5 ),当以 root 身份运行容器时,只有在脚本中切换到非 root是唯一的解决方法,例如:USER appuser
entrypoint.sh
#!/bin/sh
chown -R appuser:appgroup /path/to/volume
exec runuser -u appuser "$@"
Run Code Online (Sandbox Code Playgroud)
在 Dockerfile 中:
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
CMD ["/usr/bin/myapp"]
Run Code Online (Sandbox Code Playgroud)
调用时docker top container
我可以看到两个进程,一个是根进程,一个是非根进程
PID USER TIME COMMAND
5004 root 0:00 runuser -u appuser /usr/bin/myapp
5043 1000 0:02 /usr/bin/myapp
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的容器运行时存在根进程的漏洞,或者它被认为是安全的?
我发现关于这个主题的讨论很少(6、7 ),而且似乎没有一个是明确的。我在 StackOverflow 上查找了类似的问题,但找不到任何可以解决安全问题的相关问题(8、9、10) …
我有一个带有 2 个应用程序的 NX monorepo:
我希望使用 docker-compose 来运行我的整个环境,最终包含一些 API 和数据库等。
我创建了一个带有参数的 docker 文件,可以重新用于在 Nx 中运行多个角度应用程序:
# base image
FROM node
ARG APP
# # install chrome for protractor tests
# RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
# RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
# RUN apt-get update && apt-get install -yq google-chrome-stable
# set working directory
WORKDIR /app
# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH
# install and …
Run Code Online (Sandbox Code Playgroud) 如果没有 sudo 权限,我无法在容器中(通过 ssh)写入已安装的卷。挂载的文件夹是主机用户在主机上的主文件夹。我正在运行一个无根的 docker 守护进程。
我执行了以下步骤来启动容器:
我已经按照https://docs.docker.com/engine/security/rootless/上的说明设置了一个无根 docker
使用以下命令构建 Dockerfile(如下):
docker build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g) --build-arg USER_NAME=user--build-arg USER_PASS=user -t test 。
使用以下命令启动容器:
docker run -d --name test_container -p 50000:22 -v /home/$(id -u -n):/mnt/home 测试
通过 SSH 连接到我的容器
ssh 用户@localhost -p 50000
当我在主目录中创建文件时,权限被拒绝。当我在主机中创建一个新文件夹并将其 chmod 为 777 时;然后我可以创建文件,但它们不会以正确的用户/组出现在我的原始主机中,而是得到类似以下内容的信息:
drwxrwxrwx 6 gdekkers gdekkers 4096 May 25 21:10 .
drwxr-xr-x 14 gdekkers gdekkers 4096 May 25 21:10 ..
drwxrwxrwx 3 gdekkers gdekkers 4096 Apr 30 13:01 SomeFolder
drwxr-xr-x 2 …
Run Code Online (Sandbox Code Playgroud) 我不确定我是否有配置错误,或者我只是不知道在哪里查找,但我似乎无法找到使用这些配置存储我的文件的位置
apiVersion: v1
kind: PersistentVolume
metadata:
name: tmp-storage
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: /tmp/netes
type: Directory
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tmp-storage-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
Run Code Online (Sandbox Code Playgroud)
部署
spec:
volumes:
- name: abcd
persistentVolumeClaim:
claimName: tmp-storage-claim
containers:
...
volumeMounts:
- mountPath: '/tmp'
name: abcd
Run Code Online (Sandbox Code Playgroud)
我尝试使用 访问 docker 桌面虚拟机,docker run -it --rm --privileged --pid=host justincormack/nsenter1
但里面什么也没有/tmp
我的电脑里面也什么都没有/tmp
我也尝试过查看,/Users/username/.docker/Volumes/
但该位置没有卷目录
docker-volume ×10
docker ×9
kubernetes ×2
angular ×1
containers ×1
linux ×1
nrwl-nx ×1
permissions ×1
rootless ×1
security ×1