我是Docker的新手,我试图准确理解Docker 图像是什么.Docker镜像的每个定义都使用术语"图层",但似乎并未定义图层的含义.
从官方Docker文档:
我们已经看到Docker镜像是从中启动Docker容器的只读模板.每个图像由一系列图层组成.Docker利用联合文件系统将这些层组合成一个图像.联合文件系统允许透明地覆盖单独文件系统的文件和目录(称为分支),形成单个连贯的文件系统.
所以我问,什么是一层(确切地说); 有人能给出一些具体的例子吗?这些图层如何"拼合"形成图像?
在我的Dockerfile中,我想定义稍后可以在Dockerfile中使用的变量.
我知道该ENV指令,但我不希望这些变量成为环境变量.
有没有办法在Dockerfile范围声明变量?
我正在尝试使用自定义环境变量构建Oracle WebLogic Docker镜像
$ docker build -t 12213-domain --build-arg ADMIN_PORT=8888 --build-arg ADMIN_PASSWORD=wls .
但是我在构建日志中收到以下警告
[Warning] One or more build-args [ADMIN_PASSWORD ADMIN_PORT] were not consumed
这是我正在尝试构建的映像的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 …如果在Dockerfile顶部声明的ARG发生更改,但其值仅用于Dockerfile末尾附近的RUN命令,Docker是否从头开始重建整个映像,或者是否能够重用中间件在相关的RUN命令之前的图像?
为了更好地利用分层,我应该将我的ARG声明放在Dockerfile的顶部,还是在使用它们的部分之前?
我想我的一部分问题是ARG指令是否生成了一个中间层.
我正在研究一个具有大量环境变量的简单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" ]
我想,重新解释这个问题的一个好方法是:如何在Dockerfile中高效加载多个环境变量?如果您无法加载文件,则无法将docker文件提交到github.
我遇到了 docker-compose.env文件的一个奇怪问题。我可以在 .env 文件中使用第一个变量 key=pair,但只能使用第一个变量。这是我的文件夹结构
|- root
|  |- .env
|  |- docker-compose.yaml
|  |- service-1
|     |- Dockerfile
.env:
GIT_TOKEN=c3e13c4e33935
DB_PWD=mypassword
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
服务 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
问题是 GIT_TOKEN 变量工作正常,但 DB_PWD 变量不是。即使将 GIT_TOKEN 变量放在 echo 行中,令牌也会保存到文件中(所以我知道这不是 echo/bash 插值问题)非常感谢任何帮助。我已经阅读了所有我能找到的与 Docker 环境变量相关的内容。
注意:我修改了一些东西。我的数据库密码不是 mypassword,也不是真正的 git repo
参考:
假设我在 Dockerfile 中有这个:
ARG FOO=1
ENTRYPOINT ["docker.r2g", "run"]
我用以下方法构建上述内容:
docker build -t "$tag" --build-arg FOO="$(date +%s)" .
有没有办法做这样的事情:
ENTRYPOINT ["docker.r2g", "run", ARG FOO]  // something like this
我想这个论点也可以通过 withdocker run而不是在docker build阶段期间传递?
我最近一直在学习使用 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
上面的代码可能有也可能没有错误,因为我只是输入了它而不是复制和粘贴 - 但它在我的机器上工作。
问题是:
php-fpm 配置了--with-fpm-user=www-dataand --with-fpm-group=www-data,并在php:7.3-fpmDockerfile (see here) 中设置。
我主机上的文件以我的用户名和组作为所有者/组保存。
但是,当我通过浏览器访问应用程序时,我在启动时收到权限被拒绝错误(当 Laravel 尝试在存储中创建错误日志文件时)。我认为这是因为php-fpm作为 www-data 运行,但存储目录具有drwxr-xr-x所有者/组 phil:phil - 我的主机所有者和组的权限。
经过数小时的谷歌搜索和试验,我尝试了以下方法:
递归地将宿主机上代码目录的所有者和组更改为www-data:www-data. 这允许 Laravel 应用程序工作,但我现在无法使用 …
有什么方法可以创建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/
但MY_JAR变量出现在容器中。我在那里不需要它。它只会让用户感到困惑。我可以以某种方式做到这一点吗?