相关疑难解决方法(0)

Maven docker缓存依赖项

我正在尝试使用docker自动化maven构建.我想要构建的项目花了将近20分钟来下载所有依赖项,所以我尝试构建一个可以缓存这些依赖项的docker镜像,但它似乎并没有保存它.我的Dockerfile是

FROM maven:alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD pom.xml /usr/src/app
RUN mvn dependency:go-offline
Run Code Online (Sandbox Code Playgroud)

图像构建,它确实下载了所有内容.但是,生成的图像与基本maven:alpine图像的大小相同,因此它似乎没有缓存图像中的依赖项.当我尝试使用图像时,mvn compile它会经历整整20分钟的重新下载所有内容.

是否可以构建一个缓存我的依赖项的maven图像,这样每次我使用图像执行构建时都不必下载它们?

我正在运行以下命令:

docker build -t my-maven .

docker run -it --rm --name my-maven-project -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven my-maven mvn compile
Run Code Online (Sandbox Code Playgroud)

我的理解是,RUN在docker构建过程中的任何内容都会成为生成的图像的一部分.

java maven docker dockerfile

28
推荐指数
7
解决办法
2万
查看次数

Dockerfile:了解VOLUME指令

我们来举个例子吧.

以下是VOLUME该指令nginx的图像:

VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 当您启动容器时,这些目录是否会显示在我的主机上?当我停止我的容器时,目录将保留?

  2. 如果我的主机中已存在某些(或所有)这些目录,会发生什么?例如,假设图像/etc/nginx在容器目录中附带了一个默认配置文件/etc/nginx,我的主机上也有一个配置文件.当容器启动时,哪些文件将获得优先权?

  3. -v /host/dir:container/dir和之间的关键区别是VOLUME什么?

参考文献:

docker dockerfile

22
推荐指数
1
解决办法
7897
查看次数

如何将本地机器的 SSH 密钥传递给 docker 容器?

我正在尝试从 Dockerfile 构建一个 docker 镜像,需要采取的步骤之一是安装一个只能通过私有 Gitlab 存储库使用的依赖项。这意味着容器需要访问 SSH 密钥才能进行克隆。我知道这不是最安全的方法,但是这只是一个中间容器,一旦运行应用程序所需的所有组件都到位,它将被删除。

问题是,无论我尝试什么,我都无法在 docker 中使用 ssh 代理来建立连接。我得到:

npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.
Run Code Online (Sandbox Code Playgroud)

如果我尝试简单地克隆存储库而不运行npm install. 这是我使用的 Dockerfile:

FROM risingstack/alpine:3.4-v6.9.4-4.2.0


RUN apk update

RUN apk add openssh

ARG SSH_KEY

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 700 /root/.ssh && \ …
Run Code Online (Sandbox Code Playgroud)

git ssh docker dockerfile docker-container

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

如何在容器中挂载文件,在首次运行之前不可用?

我正在尝试为使用基于文件的数据库的webapp构建Dockerfile.我希望能够从主机安装文件*该文件位于完整软件安装的根目录中,因此安装完整的目录并不是很理想.

另一个问题是在第一次使用之前,尚未创建数据库文件.第一次用户将没有数据库,但另一个用户可能没有.我不能在建造期间"装载"任何东西**我相信.

它可能会像这样工作:

  • 第一个/新数据库启动:
    • 启动容器(不安装).
    • webapp创建一个数据库.
    • 停止容器
  • 后续开始:
    • 使用a -v来装入文件来启动容器

如果用户不需要额外的启动/停止会更好.即使它是,我仍然在寻找一种方法来做这个用户友好,可能有2'方法'启动它(也许我可以在docker-compose和'普通'方法中定义第一启动的东西? ).

我怎么能以简单的方式做到这一点,以便任何第一次用户都清楚?

*原因是您可以将Dockerfile和数据库文件复制为备份,并且仅使用这两个元素启动并运行.

**如何在构建期间将主机卷装载到Dockerfile中的docker容器中

docker

6
推荐指数
1
解决办法
537
查看次数

Docker COPY主机$ {HOME} /。cache到容器

我想将我的winetricks缓存复制到docker容器中:

主办:

~/.cache/winetricks
Run Code Online (Sandbox Code Playgroud)

到集装箱

/home/myUser/.cache/winetricks.
Run Code Online (Sandbox Code Playgroud)

我当前的方法是在docker根目录中创建缓存的副本,并用于COPY将缓存移至容器。这将使高速缓存在构建时可用。

我正在使用这种方法来节省构建时间。Docker COPY命令在生产中已被注释掉。

所以这是我的问题:为什么我必须复制~/.cache目录?为什么无法将目录从Docker根目录外部复制到容器中?

docker

6
推荐指数
1
解决办法
2228
查看次数

docker build - 避免添加仅在构建时需要的文件

我正在尝试构建一个 docker 镜像,避免不必要的批量处理,我遇到了一个我认为应该很常见的问题,但到目前为止我还没有找到一个简单的解决方案。(我正在 ubuntu 18.04 系统上构建 docker,并从一个FROM ubuntu层开始。)

特别是,我需要在映像中安装一个非常大的 .deb 文件(超过 3G)。COPYor ADDit and then很容易RUN dpkg -i,但这会导致我不需要的几 GB 空间重复。当然,仅删除文件并不会减小图像大小。

我希望能够挂载一个卷来访问.deb文件,而不是COPY它,这在运行容器时很容易做到,但在构建容器时显然不可能做到?

到目前为止,我想出的是将 docker 构建到我要ADD文件的位置,然后在安装了卷的情况下运行它,这样我就可以从容器中访问它而无需COPYing 它,然后我dpkg -i它,然后我做docker commit 从该容器创建映像。果然,我最终得到的图像比我第一次尝试小 3GB 以上,但这似乎是一种黑客行为,并且使构建脚本变得更加复杂。

我认为必须有更合适的方法来实现这一目标,但到目前为止,我的搜索还没有找到明显的答案。我错过了什么吗?

docker dockerfile docker-build

6
推荐指数
1
解决办法
955
查看次数

Docker:docker-compose 将文件从容器复制到主机

我想在安装过程中将所有文件复制到docker-compose.yml文件中。

如果我运行:

$ git clone https://github.com/laravel/laravel.git laravel-app
$ cd laravel-app
$ docker run --rm -v $(pwd):/app composer install
Run Code Online (Sandbox Code Playgroud)

它将在 docker 容器中的安装过程中将所有新文件从容器复制到主机。

所以我会在安装后在我的目录中看到新的vendor文件夹和composer.lock文件laravel-app


但是,如果我将音量设置为docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network
Run Code Online (Sandbox Code Playgroud)

然后在Dockerfile以下位置设置安装过程:

FROM php:7.4.4-fpm

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN …
Run Code Online (Sandbox Code Playgroud)

php laravel docker dockerfile docker-compose

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

Docker:如何将sqlite数据库更改持久保存到db文件?

FROM golang:1.8

ADD . /go/src/beginnerapp

RUN go get -u github.com/gorilla/mux

RUN go get github.com/mattn/go-sqlite3

RUN go install beginnerapp/

VOLUME /go/src/beginnerapp/local-db

WORKDIR /go/src/beginnerapp

ENTRYPOINT /go/bin/beginnerapp

EXPOSE 8080
Run Code Online (Sandbox Code Playgroud)

sqlite db文件在local-db目录中,但是我似乎没有VOLUME正确使用命令。关于如何对sqlite db文件进行数据库更改的任何想法仍然存在?

我不在乎该卷是在构建之前还是之后安装的。

我也尝试运行以下命令

user@cardboardlaptop:~/go/src/beginnerapp$ docker run -p 8080:8080 -v ./local-db:/go/src/beginnerapp/local-db beginnerapp
Run Code Online (Sandbox Code Playgroud)

docker:来自守护程序的错误响应:create ./local-db:“ ./local-db”包含本地卷名的无效字符,只有“ [a-zA-Z0-9] [a-zA-Z0-9_。 -]“ 被允许。如果要传递主机目录,请使用绝对路径。

编辑:使用/absolutepath/local-db而不是相对路径使用./local-db

sqlite docker dockerfile

4
推荐指数
1
解决办法
4687
查看次数

使用 dockerfile 安装 Composer

我对 docker 还很陌生,我尝试在 Dockerfile 中自动执行 Composer install,但在安装时似乎无法 cd 进入我的应用程序,出了什么问题?或者也许还有另一种更好的方法来做到这一点?

我的 docker-compose.yml

version: "3.1"
services:

    app:
      image: nginx:alpine
      container_name: app
      working_dir: /application
      volumes:
          - ./Projects/app:/application/app
          - ./Docker/nginx/app.conf:/etc/nginx/conf.d/app.conf
      ports:
          - "8080:8080"

    php-fpm-app:
      build: Docker/php-fpm-app
      container_name: php-fpm-app
      working_dir: /application
      volumes:
          - ./Projects:/application
          - ./Docker/php-fpm-app/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini
Run Code Online (Sandbox Code Playgroud)

我的 Dockerfile

FROM phpdockerio/php72-fpm:latest
WORKDIR "/application"

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

RUN mkdir -p /var/www/.composer \
    && chown -R www-data:www-data /var/www/.composer

USER www-data

RUN cd /application/app; composer install
Run Code Online (Sandbox Code Playgroud)

我运行此命令后的输出:

docker-compose up -d

Step 6/6 : RUN …
Run Code Online (Sandbox Code Playgroud)

php composer-php docker dockerfile docker-compose

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

Docker run --mount 在运行期间使所有文件在不同的文件夹中可用

我想让我的主机上的文件夹在RUN声明期间可用。也就是说,类似于容器运行的效果-v

docker run -v /path/on/host:/path/in/container mycontainer:tag
Run Code Online (Sandbox Code Playgroud)

在容器中,这为我/path/in/container提供了path/on/host.

为此,我正在尝试https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md 中的实验挂载选项:

RUN --mount=type=bind,target=/path/on/host
Run Code Online (Sandbox Code Playgroud)

/path/on/hostRUN.

然后我有两个问题:

  1. 我可以ls在里面文件/path/on/host,但不能使用它们(例如cat它们)。我试图改变type到如cache使用sourcehttps://devops.stackexchange.com/questions/6078/in-a-dockerfile-is-there-a-way-to-avoid-copying-files-to-make- them-accessible-t,但我无法让它工作。

  2. 我无法弄清楚如何在“RUN图像”中使用不同的路径,即,/path/in/container而不是/path/on/host.

docker dockerfile docker-buildkit

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