标签: docker

Docker:使用 ADD 添加的文件夹的权限被拒绝

我正在尝试使用 docker 配置 postgresql 安装。

FROM ubuntu:13.10

ADD . /db

# install postgres
# ...

RUN chown postgres:postgres /db -R && \
    chmod 700 /db -R

USER postgres
RUN /etc/init.d/postgresql start &&\
    createdb test &&\
    psql -d test -f /db/all.sql
Run Code Online (Sandbox Code Playgroud)

我可以访问文件夹/db,但不能访问/db/plpgsql(其中包含由/db/all.sql 执行的文件)

我在 /db/plpgsql 上尝试了 chmod 777 但它也不起作用,权限被拒绝。

postgres@c364bdd94652:/$ ls -l | grep db
drwxrwxrwx   5 postgres postgres 4096 Jul 10 17:39 db
postgres@c364bdd94652:/$ cd db/
postgres@c364bdd94652:/db$ ls -l
-rwxrwxrwx  1 postgres postgres   2567 Jul 10 16:34 Dockerfile
-rwxrwxrwx  1 …
Run Code Online (Sandbox Code Playgroud)

postgresql linux permissions docker

7
推荐指数
1
解决办法
3195
查看次数

使用 nc 将文件从 Docker 容器发送到主机:为什么主机 nc 过早关闭连接?

以下 BASH 脚本在 Docker 容器中下载并构建mpv(https://github.com/mpv-player/mpv-build),并使用 netcat 将文件发送到主机(主机正在使用 netcat 侦听):

HOSTIP="192.168.1.100"
PORT="62514"

nc -v -l $PORT > mpv &

sleep 1

sudo docker run ubuntu:14.04 /bin/bash -c "\
sed -i -e 's/# deb/deb/g' /etc/apt/sources.list; \
cat /etc/apt/sources.list; \
apt-get update; \
apt-get install --yes --force-yes git python-minimal; \
git clone https://github.com/mpv-player/mpv-build.git; \
cd mpv-build/; \
./update; \
apt-get install --yes --force-yes devscripts equivs; \
rm -f mpv-build-deps_*_*.deb; \
mk-build-deps -i -t \"apt-get --yes --force-yes --no-install-recommends\"; \
./build …
Run Code Online (Sandbox Code Playgroud)

netcat docker

7
推荐指数
1
解决办法
3361
查看次数

可公开路由的 IPv6 linux 容器

我的目标是为我的每个 docker 容器拥有一个可路由的公共 IPv6 地址。我希望能够使用 IPv6 协议连接进出我的容器。

我正在使用 Linode 并且我被分配了一个公共 IPv6 池:

2600:3c01:e000:00e2:: / 64 routed to 2600:3c01::f03c:91ff:feae:d7d7
Run Code Online (Sandbox Code Playgroud)

该“路由到”地址是由 dhcp 自动配置的:

# ip -6 addr show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2600:3c01::f03c:91ff:feae:d7d7/64 scope global mngtmpaddr dynamic
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 fe80::f03c:91ff:feae:d7d7/64 scope link
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

我设置了 AAAA 记录,ipv6.daaku.org以便更轻松地使用:

# nslookup -q=AAAA ipv6.daaku.org
ipv6.daaku.org  has AAAA address 2600:3c01:e000:e2::1
Run Code Online (Sandbox Code Playgroud)

为了测试,我手动分配了该地址:

# ip -6 addr add 2600:3c01:e000:00e2::1/64 dev eth0
# ip -6 addr show …
Run Code Online (Sandbox Code Playgroud)

ipv6 containers docker

7
推荐指数
1
解决办法
2120
查看次数

Nginx:在supervisord下运行nginx时如何使用docker日志收集器

官方 nginx docker镜像 ( Dockerfile ) 使用以下技巧将其日志传递到 stdout 和 stderr,以便它们被 docker 日志收集器捕获并使用docker logs <container-name>以下命令查看:

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
Run Code Online (Sandbox Code Playgroud)

我想这样做,但我已经supervisord为PID 1我的容器,它监督nginx的过程,并捕获输出和错误,并把它放在它自己的日志文件。因此日志不会到达 docker 日志收集器。

这是我的 supervisord.conf 中的相关块

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
priority=990
; NOTE: We do not want to redirect stdout and stderr of a nginx process to a logfile because we want docker log collector to get them.
stdout_logfile= …
Run Code Online (Sandbox Code Playgroud)

nginx logging supervisord docker

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

从 docker 容器内部发送邮件

我是 Docker 的新手,对 linux 一共 n00b,如果这听起来很傻,我很抱歉。

我已经在 Digital Ocean 上启动并运行了一个 docker 系统,并且运行良好。

我正在使用预先构建的Mirth Connect docker ,它运行良好,我可以做各种很酷的事情。我希望 Mirth 为我做的一件事是从容器内部发送电子邮件(SMTP 发件人),但 Docker 容器似乎无法发送电子邮件(我收到关于连接到我的邮件服务器的错误)。我在运行时尝试将端口 25 映射到 25,但什么也没做。

docker run -d --name mirth1 -p 8080:8080  -p 8443:8443 -p 25:25 -p 8585:8585 brandonstevens/mirth-connect
Run Code Online (Sandbox Code Playgroud)

linux 服务器可以通过端口 25 telnet 到我的邮件服务器,所以我知道这不是防火墙/数字海洋问题。这也不是欢乐的问题,因为我以前十亿次都没有这样做过。它在容器内的东西

所以我想这比我想象的要多。谷歌搜索显示了很多关于将 sendmail 添加到我的容器的链接,但那是针对 php 系统的吗?

smtp docker

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

无法在 GCE Debian Jessie 实例上启用 cgroup_enable=memory swapaccount=1

为了支持 Docker 内存限制/配额,我想启用

cgroup_enable=memory swapaccount=1
Run Code Online (Sandbox Code Playgroud)

我的 Debian Jessie Google Cloud Compute Engine 实例上的 Linux 内核命令行选项。将它们添加到/etc/default/grub、更新和重新启动后,我可以看到以下选项处于活动状态/proc/cmdline:

BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=aeb374a4-1a04-4ed7-adac-d5c57b350575 ro console=ttyS0,38400n8 elevator=noop cgroup_enable=memory swapaccount=1
Run Code Online (Sandbox Code Playgroud)

但是,docker info仍然抱怨它们被禁用:

$ docker info
[...]
WARNING: No kernel memory limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
[...]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?GCE Debian 映像中包含的内核是否在不支持这些功能的情况下构建?

linux debian docker google-compute-engine

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

如何防止 docker 容器在 Windows 中的守护进程启动时自动启动?

我在 Windows 10 上使用 Docker 及其 docker-compose 功能。

现在,当我运行命令docker-compose up -d在后台启动一些容器时,即使在重新启动 Docker-Host 后,启动的容器也会运行。

我怎样才能防止这种情况?我只希望它们在我明确启动时启动。

windows docker windows-10 docker-compose

7
推荐指数
1
解决办法
7938
查看次数

Docker:限制访问某些 IP 地址的正确方法

我有一个 Docker 容器向 Internet 公开端口 3306。我想限制对某些公共 IP 地址的访问。例如,让我们使用 1.2.3.4。

作为附加条件,我希望规则在重新启动 Docker 守护程序和重新启动服务器后仍然存在。这允许我在服务器重新启动时使用iptables-persistent( iptables-save/ iptables-restore) 来恢复规则,而不会dockerd干扰它的启动。

我尝试了以下方法:

  1. 修改FORWARD链:

    iptables -I FORWARD -p tcp --dport 3306 -j REJECT
    iptables -I FORWARD -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT
    
    Run Code Online (Sandbox Code Playgroud)

    这在启动 Docker 守护进程后完成。重新启动守护进程时,Docker 在链的顶部插入了额外的规则,而我的自定义规则最终会被忽略。

  2. 修改DOCKER链:

    iptables -N DOCKER # if chain does not yet exist
    iptables -I DOCKER -p tcp --dport 3306 -j REJECT
    iptables -I DOCKER -p tcp --dport 3306 -s 1.2.3.4 …
    Run Code Online (Sandbox Code Playgroud)

networking iptables docker

7
推荐指数
1
解决办法
2077
查看次数

docker-compose 在主机中存储的 docker 卷在哪里?

考虑以下docker-compose文件

version: "2"
services:
  postgres:
    image: postgres:9.6
    volumes:
      - ./vol_folder:/var/lib/postgresql
    ports:
      - "5432:5432"
Run Code Online (Sandbox Code Playgroud)

这是我的命令历史记录 mac

docker-compose up

psql -h 192.168.99.100 -p 5432 -U postgres

create table test (my_id bigserial primary key);
INSERT INTO test (my_id) values (1);
SELECT * FROM test;

\q
Run Code Online (Sandbox Code Playgroud)

本来我认为上面的命令会导致在主机中.sql创建一个文件./vol_folder。但我没有看到任何.sql文件,./vol_folder而只是一个空data目录./vol_folder

此外,如果我docker-compose down和docker-compose up我再次可以看到数据库中的数据我现在没有了。

我怀疑当我在映像运行时创建数据时,数据没有存储回,./vol_folder因此当我重新启动时,主机上没有任何东西可以挂载。

所以我想我的问题是我的主机中存储的卷在哪里?docker volume 只有一种方式(例如,主机数据到容器)而不是两种方式吗?

postgresql docker docker-compose

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

在任何 dockerfile 上运行 docker build 时出错:“无法准备上下文:无法评估 Dockerfile 路径中的符号链接”

我在跑 :

$ docker build -t somefile .
Run Code Online (Sandbox Code Playgroud)

每次我运行时都会收到此错误:

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat 
Run Code Online (Sandbox Code Playgroud)

完整的错误是:

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/someusername/code/Dockerfile: no such file or directory
Run Code Online (Sandbox Code Playgroud)

我认为这与我使用的 docker 版本有关,因此使用本指南升级到最新版本: 安装最新的 docker 版本。我仍然遇到同样的错误。我尝试过不同的 docker 版本。我在不同的服务器上尝试过。我什至尝试过不同的 docker 文件。

我试过的最后一台服务器使用的是这个版本的 docker:

Docker version 17.03.1-ce, build c6d412e
Run Code Online (Sandbox Code Playgroud)

不知道我哪里出错了。请需要进行健全性检查。

linux docker ubuntu-16.04

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