相关疑难解决方法(0)

什么是Docker图像"图层"?

我是Docker的新手,我试图准确理解Docker 图像是什么.Docker镜像的每个定义都使用术语"图层",但似乎并未定义图层的含义.

从官方Docker文档:

我们已经看到Docker镜像是从中启动Docker容器的只读模板.每个图像由一系列图层组成.Docker利用联合文件系统将这些层组合成一个图像.联合文件系统允许透明地覆盖单独文件系统的文件和目录(称为分支),形成单个连贯的文件系统.

所以我问,什么是一层(确切地说); 有人能给出一些具体的例子吗?这些图层如何"拼合"形成图像?

docker

137
推荐指数
7
解决办法
5万
查看次数

如何在Dockerfile中定义变量?

在我的Dockerfile中,我想定义稍后可以在Dockerfile中使用的变量.

我知道该ENV指令,但我不希望这些变量成为环境变量.

有没有办法在Dockerfile范围声明变量

variables docker dockerfile

121
推荐指数
5
解决办法
11万
查看次数

Docker,一个或多个未消耗的构建参数

我正在尝试使用自定义环境变量构建Oracle WebLogic Docker镜像

$ docker build -t 12213-domain --build-arg ADMIN_PORT=8888 --build-arg ADMIN_PASSWORD=wls .
Run Code Online (Sandbox Code Playgroud)

但是我在构建日志中收到以下警告

[Warning] One or more build-args [ADMIN_PASSWORD ADMIN_PORT] were not consumed
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试构建的映像的Dockerfile

#Copyright (c) 2014-2017 Oracle and/or its affiliates. All rights reserved.
#
#Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
#
# ORACLE DOCKERFILES PROJECT
# --------------------------
# This Dockerfile extends the Oracle WebLogic image by creating a sample domain.
#
# Util scripts are copied into the image enabling users to …
Run Code Online (Sandbox Code Playgroud)

docker

21
推荐指数
1
解决办法
2万
查看次数

将ARG放在Dockerfile的顶部会阻止层重用吗?

如果在Dockerfile顶部声明的ARG发生更改,但其值仅用于Dockerfile末尾附近的RUN命令,Docker是否从头开始重建整个映像,或者是否能够重用中间件在相关的RUN命令之前的图像?

为了更好地利用分层,我应该将我的ARG声明放在Dockerfile的顶部,还是在使用它们的部分之前?

我想我的一部分问题是ARG指令是否生成了一个中间层.

docker dockerfile

18
推荐指数
2
解决办法
3247
查看次数

你可以使用.env文件作为独立的Dockerfile吗?

我正在研究一个具有大量环境变量的简单Docker镜像.你能导入一个像docker-compose一样的环境变量文件吗?我在docker文件文档中找不到任何相关内容.

Dockerfile

FROM python:3.6

ENV ENV1 9.3
ENV ENV2 9.3.4
...

ADD . /

RUN pip install -r requirements.txt

CMD [ "python", "./manager.py" ]
Run Code Online (Sandbox Code Playgroud)

我想,重新解释这个问题的一个好方法是:如何在Dockerfile中高效加载多个环境变量?如果您无法加载文件,则无法将docker文件提交到github.

docker

13
推荐指数
3
解决办法
2万
查看次数

来自 docker-compose .env 文件的多个 Docker 构建参数

我遇到了 docker-compose.env文件的一个奇怪问题。我可以在 .env 文件中使用第一个变量 key=pair,但只能使用第一个变量。这是我的文件夹结构

|- root
|  |- .env
|  |- docker-compose.yaml
|  |- service-1
|     |- Dockerfile
Run Code Online (Sandbox Code Playgroud)

.env:

GIT_TOKEN=c3e13c4e33935
DB_PWD=mypassword
Run Code Online (Sandbox Code Playgroud)

docker-compose.yaml:

version: '3'
web-server:
      container_name: service-1
      image: sdc/service-1:0.1
      build:
        context: ./service-1
        args:
          - GIT_TOKEN=$GIT_TOKEN
          - DB_PWD=$DB_PWD
Run Code Online (Sandbox Code Playgroud)

服务 1/Dockerfile:

FROM node:boron
ARG GIT_TOKEN
ARG DB_PWD
RUN git clone https://${GIT_TOKEN}@github.com/chrxn/sdc.git
RUN echo {"database_password:" $DB_PWD } > crews.txt
Run Code Online (Sandbox Code Playgroud)

问题是 GIT_TOKEN 变量工作正常,但 DB_PWD 变量不是。即使将 GIT_TOKEN 变量放在 echo 行中,令牌也会保存到文件中(所以我知道这不是 echo/bash 插值问题)非常感谢任何帮助。我已经阅读了所有我能找到的与 Docker 环境变量相关的内容。

注意:我修改了一些东西。我的数据库密码不是 mypassword,也不是真正的 git repo

参考:

environment-variables docker dockerfile docker-compose

9
推荐指数
1
解决办法
6909
查看次数

将 ARG 传递给 ENTRYPOINT

假设我在 Dockerfile 中有这个:

ARG FOO=1
ENTRYPOINT ["docker.r2g", "run"]
Run Code Online (Sandbox Code Playgroud)

我用以下方法构建上述内容:

docker build -t "$tag" --build-arg FOO="$(date +%s)" .
Run Code Online (Sandbox Code Playgroud)

有没有办法做这样的事情:

ENTRYPOINT ["docker.r2g", "run", ARG FOO]  // something like this
Run Code Online (Sandbox Code Playgroud)

我想这个论点也可以通过 withdocker run而不是在docker build阶段期间传递?

docker dockerfile docker-build docker-entrypoint docker-run

8
推荐指数
2
解决办法
1万
查看次数

Docker php-fpm 作为 www-data 运行

我最近一直在学习使用 Docker 构建图像和容器。使用 Mac 时我对它相当有信心,但最近切换到 Ubuntu,我对这方面的开发还很陌生。

我使用一个标准的新 Laravel 项目作为我的“代码”,目前我只使用一个 php 容器和 nginx 容器。

我正在使用一个docker-compose.yml文件来创建我的容器:

version: "3.1"

services:
    nginx:
        image: nginx:latest
        volumes:
            - ./code:/var/www
            - ./nginx_conf.conf:/etc/nginx/conf.d/default.conf
        ports:
            - "80:80"
    php:
        image: php:7.3-fpm
        ports:
            - 9000
        volumes:
            - ./code:/var/www
Run Code Online (Sandbox Code Playgroud)

上面的代码可能有也可能没有错误,因为我只是输入了它而不是复制和粘贴 - 但它在我的机器上工作。

问题是:

  • php-fpm 配置了--with-fpm-user=www-dataand --with-fpm-group=www-data,并在php:7.3-fpmDockerfile (see here) 中设置

  • 我主机上的文件以我的用户名和组作为所有者/组保存。

  • 当我进入容器时,文件归 1000 和组 1000 所有(我假设映射到我的用户帐户和主机上的组?)

但是,当我通过浏览器访问应用程序时,我在启动时收到权限被拒绝错误(当 Laravel 尝试在存储中创建错误日志文件时)。我认为这是因为php-fpm作为 www-data 运行,但存储目录具有drwxr-xr-x所有者/组 phil:phil - 我的主机所有者和组的权限。

经过数小时的谷歌搜索和试验,我尝试了以下方法:

  • 递归地将宿主机上代码目录的所有者和组更改为www-data:www-data. 这允许 Laravel 应用程序工作,但我现在无法使用 …

php docker docker-compose

6
推荐指数
2
解决办法
9988
查看次数

在 Dockerfile 中定义区域设置环境变量

有什么方法可以创建Dockerfile仅在构建过程中可用的局部变量吗?我可以看到,如果我使用ENV关键字定义一个变量,那么它将稍后在图像中作为导出的环境变量使用。但我想要一个仅具有构建范围的“技术”变量。

我想避免在我的 Dolerfile 中重复,因此我希望有一个仅可从 Dockerfile 获取的变量:

ENV MY_JAR=myJar.jar
COPY bin/$MY_JAR $ORACLE_HOME/user_projects/domains/$DOMAIN_NAME/lib/
COPY bin/$MY_JAR $ORACLE_HOME/wlserver/server/lib/mbeantypes/
Run Code Online (Sandbox Code Playgroud)

MY_JAR变量出现在容器中。我在那里不需要它。它只会让用户感到困惑。我可以以某种方式做到这一点吗?

docker dockerfile docker-compose

3
推荐指数
1
解决办法
2898
查看次数