- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
核心问题是,当容器为持久性创建文件时,它们实际上归 root 所有,需要我输入 sudo 密码才能删除。我希望所有容器都以我的用户身份运行,或者至少以我可以删除容器创建的临时文件的方式运行。看看这个最小的例子:
# docker-compose.yml
version: "2.2"
services:
app:
build: .
container_name: app
environment:
- UID=${UID}
- GID=${GID}
- USER=${USER}
# Dockerfile
FROM alpine
RUN apk update
RUN apk upgrade
RUN apk add shadow
RUN useradd -G root,wheel -u ${UID} -g ${GID} -s /bin/ash -d /home/${USER} ${USER}
USER ${USER}
CMD /bin/ash
# output
❯ docker-compose up -d --remove-orphans --build
[+] Building 0.4s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 212B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 32B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.0s
=> [1/5] FROM docker.io/library/alpine 0.0s
=> CACHED [2/5] RUN apk update 0.0s
=> CACHED [3/5] RUN apk upgrade 0.0s
=> CACHED [4/5] RUN apk add shadow 0.0s
=> ERROR [5/5] RUN useradd -G root,wheel -u ${UID} -g ${GID} -s /bin/ash -d /home/${USER} ${USER} 0.3s
------
> [5/5] RUN useradd -G root,wheel -u ${UID} -g ${GID} -s /bin/ash -d /home/${USER} ${USER}:
#0 0.325 useradd: invalid user ID '-g'
------
failed to solve: executor failed running [/bin/sh -c useradd -G root,wheel -u ${UID} -g ${GID} -s /bin/ash -d /home/${USER} ${USER}]: exit code: 3
useradd
命令失败,因为没有设置环境变量。这意味着正在运行的命令是 /bin/sh -c useradd -G root,wheel -u -g -s/bin/ash -d/home
。
Add environments to docker-compose.yml file这正是我在这里所做的。
Add -e option when running Dockerfile .
我还尝试在 docker-compose
和 docker build
命令前添加环境变量,如下所示:
UID=$UID GID=$GID USER=$USER docker-compose up --build --remove-orphans -d
和
UID=1000 GID=1000 USER=myusername docker-compose up --build --remove-orphans -d
为了更好的衡量,我还尝试在 docker-compose.yml
我还尝试将环境变量放入 .env 文件中
USER=myusername
GID=1000
UID=1000
所以我正在寻找为什么它没有收到任何东西的解释以及尝试解决方案的建议。
按照建议尝试 -u
选项:
❯ docker build -t abc -u "$(id -u):$(id -g)" -f Dockerfile .
unknown shorthand flag: 'u' in -u
See 'docker build --help'.
❯ docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--network string Set the networking mode for the RUN instructions during build (default "default")
--no-cache Do not use cache when building the image
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful build (default true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list Name and optionally a tag in the 'name:tag' format
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
❯ lsb_release -a
LSB Version: n/a
Distributor ID: ManjaroLinux
Description: Manjaro Linux
Release: 21.3.0
Codename: Ruah
❯ docker --version
Docker version 20.10.16, build aa7e414fdc
❯ docker-compose --version
Docker Compose version 2.6.0
最佳答案
构建图像时,只有 build:
block 的内容可用。 environment:
block 在 Dockerfile 中不可用,volumes:
mounts 或 networks:
(包括自动 networks: [默认]
).
原则上,您可以通过将这些参数声明为 ARG
来使您的 Dockerfile 工作。在 Dockerfile 中,并将它们传递给 build: { args: }
在撰写文件中。
但是,“哪个用户正在运行此容器”通常不是您想要构建到您的镜像中的内容 - 想象一下,只要有人拥有不同的用户名或用户 ID,就必须从源代码重建工具。您可以使用撰写 user:
指令使容器以您在运行时选择的不同用户 ID 运行。出于共享文件的目的,这通常需要是一个数字 用户 ID(id -u
的输出)。您不需要为此在图像中进行任何设置。用户不会存在于容器的 /etc/passwd
文件中,但这样做的唯一结果通常是一些交互式 shell 提示中的外观投诉。
version: "2.2"
services:
app:
build: .
user: 1000
# volumes:
# - ./app_data:/data
在 Dockerfile 中,我建议设置一个专用目录来保存应用程序的可写数据(如果需要的话)。创建非 root 用户是一种很好的做法,但它不需要特定的 uid。保留大部分文件为 root 所有,其他用户不可写;不要RUN chown
或RUN chmod
。上面显示的 volumes:
挂载会将容器目录替换为主机目录,包括其(数字)所有权。
FROM alpine
# Create the non-root user (BusyBox adduser syntax)
RUN adduser -S -D -H nonroot
# ... do the normal things to install and build your application ...
# (still as root; do not chown the files)
# Create the data directory
RUN mkdir /data && chown nonroot /data
# Switch to the non-root user only to run the actual container
USER nonroot
CMD ["the_program"]
关于Dockerfile 不接收环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72735892/
我正在尝试使用谷歌云构建触发器来构建我的 docker 容器。不幸的是,构建没有找到我的 docker 文件。它不在我的存储库的根目录中,但我认为我可以指定一个相对路径。显然我配置错误了。下面是我的
我可以像这样构建一个 Dockerfile docker build -t deepak/ruby . 但是对于一个不名为Dockerfile的Dockerfile # DOCKER-VERSION
是否可以命名构建阶段?我正在搜索类似以下示例的内容: ARG NAME FROM python:3.7-alpine as modul-${NAME} # ... 如果我尝试这个例子,就会发生这个错误
在我的 Dockerfile 中,我需要使用命令替换来添加一些环境变量。我想设置 ENV PYTHONPATH /usr/local/$(python3 -c 'from distutils impo
以下Dockerfile包含四个COPY层: COPY README.md ./ COPY package.json ./ COPY gulpfile.js ./ COPY __BUILD_NUMBE
我正在尝试从我创建的 Dockerfile 中拉取 tomcat,并使用以下命令拉取 centos: FROM centos RUN docker run -it tomcat 然后现在我正在创建一个
我不确定是否应该为我的 Node.js 应用程序创建不同的 Dockerfile 文件。一种用于没有开发依赖项的生产,另一种用于包含开发依赖项的测试。 或者一个基本上是开发Dockerfile.dev
我拥有的是多个相似且简单的dockerfile 但我想要的是有一个单一的基础 dockerfile 和我的 dockerfile将他们的变量传递给它。 在我的例子中,dockerfile 之间的唯一区
我有一个应用程序有两个 Dockerfile ,说 Dockerfile.foo和 Dockerfile.bar ,预计将为 docker-compose.yml 的两个不同服务生成两个不同的图像.
我是一个 docker maven 插件新手。 如果我理解得很好,根据Spotify's Dockerfile Maven documentation ,应该将 Dockerfile 放在我的项目的根
我正在设置一个docker容器,将在this article之后在nginx服务器上为我的Angular 5应用程序提供服务。 本文提出了这个Dockerfile: # Stage 0, based
大家好, 我是 docker 的新手,我想容器化我的 ASP.NET Core 应用程序,但出现错误,我无法继续构建我的图像 这是我的示例 Dockerfile FROM microsoft/dotn
我想在不使用注册表的情况下链接 Dockerfiles,这可以通过 FROM 实现吗?陈述? 以两个 Dockerfile 为例: Dockerfile /some/other/dir/Dockerf
我尝试在公共(public) dockerhub 上通过我自己的镜像安装 Airflow,但它在本地运行完美,但当我尝试在 Openshift 上使用它时。我在下面收到此错误。 `ERROR: Cou
此 dockerfile 工作正常。但是如何在 dockerfile 中执行命令? FROM alpine RUN apk add --update sqlite && rm -rf /var/cac
当我尝试设置自动构建时,我的 Docker Hub 存储库中的 Dockerfile 为空。如果我触发构建:- Build failed: Dockerfile not found at ./Dock
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
我目前正在将一个巨大的 DockerFile 拆分为单独的 DockerFile,但是在巨大的 DockerFile 中定义的一些变量需要在单独的 DockerFile 中使用。 Docker 是否有
我有一个 Dockerfile 可以创建我想在这里使用的构建镜像:~/build/Dockerfile 然后我使用一个标准镜像来部署 从 ~/build/Dockerfile 构建的图像没有在任何地方
我运行这个: ➜ frontend git:(master) ✗ docker-compose up Building web ERROR: Cannot locate specified Dock
我是一名优秀的程序员,十分优秀!