我从openjdk创建了一个docker镜像:8-jdk-alpine但是当我尝试执行简单的命令时,我得到以下错误:
RUN bash
/bin/sh: bash: not found
RUN ./gradlew build
env: can't execute 'bash': No such file or directory
Run Code Online (Sandbox Code Playgroud) 要为Ubuntu映像启动交互式shell,我们可以运行:
ole@T:~$ docker run -it --rm ubuntu
root@1a6721e1fb64:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Run Code Online (Sandbox Code Playgroud)
但是当为Alpine Docker镜像运行时,会产生以下结果:
ole@T:~$ docker run -it --rm alpine
Error response from daemon: No command specified
Run Code Online (Sandbox Code Playgroud)
在Alpine基础容器中启动交互式shell的命令是什么?
Java 11被宣布为最新的LTS版本.因此,我们正在尝试基于此Java版本启动新服务.
但是,Java 11的基本Docker镜像远大于Java 8的等效镜像:
openjdk:8-jre-alpine:84 MB
openjdk:11-jre-slim:283 MB
(我只考虑每个Java版本的官方OpenJDK和最轻量级的图像.)
更深入的挖掘发现了以下"事物":
的openjdk:11-jre-slim图像使用基本图像debian:sid-slim.这带来了两个问题:
这比60 MB大 alpine:3.8
在Debian的sid版本是不稳定
openjdk-11-jre-headless安装在映像中的包比(运行Docker容器内部)大3倍openjdk8-jre:
openjdk:8-jre-alpine:
Run Code Online (Sandbox Code Playgroud)/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
openjdk:11-jre-slim:
Run Code Online (Sandbox Code Playgroud)# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
更深入地我发现了这种沉重的"根" - 这modules是JDK 的文件:
Run Code Online (Sandbox Code Playgroud)# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
所以,现在问题来了:
为什么alpine不再使用Java 11 slim图像的基本映像?
为什么不稳定的sid版本用于LTS Java图像?
为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大?
我在Raspberry Pi 2上运行alpine-linux.我试图通过这个命令安装Pillow:
pip install pillow
Run Code Online (Sandbox Code Playgroud)
这是命令的输出:
Installing collected packages: pillow
Running setup.py install for pillow
Complete output from command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-gNq0WA/pillow/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-nDKwei-record/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_py
creating build
creating build/lib.linux-armv7l-2.7
creating build/lib.linux-armv7l-2.7/PIL
copying PIL/XVThumbImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/XpmImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/XbmImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/WmfImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/WebPImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/WalImageFile.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/TiffTags.py -> build/lib.linux-armv7l-2.7/PIL
copying PIL/TiffImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL
copying …Run Code Online (Sandbox Code Playgroud) 什么是.build-deps在下面的命令?我无法在Alpine文档中找到解释.这是一个预定义的文件吗?在许多Dockerfiles中都会看到这个引用.
RUN apk add --no-cache --virtual .build-deps \
gcc \
freetype-dev \
musl-dev
RUN pip install --no-cache-dir <packages_that_require_gcc...> \
RUN apk del .build-deps
Run Code Online (Sandbox Code Playgroud) 假设我所在的网络有 MITM SSL 交换防火墙(google.com 不是由 Google 颁发的,而是由自定义 CA 根权限重新颁发的),这里有更多详细信息https://security.stackexchange.com/questions/107542/is- it-common-practice-for-companies-to-mitm-https-traffic。
我有简单的 Dockerfile:
FROM alpine:latest
RUN apk --no-cache add curl
Run Code Online (Sandbox Code Playgroud)
它因 SSL 错误而严重失败
=> ERROR [2/2] RUN apk --no-cache add curl 1.0s
------
> [2/2] RUN apk --no-cache add curl:
#5 0.265 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
#5 0.647 140037857143624:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#5 0.649 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied
#5 0.649 fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
#5 0.938 140037857143624:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#5 0.940 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/community: Permission denied
#5 0.941 ERROR: unable to …Run Code Online (Sandbox Code Playgroud) 我注意到使用基本操作系统Alpine与CentOS或Debian在Docker容器中安装Pandas和Numpy(它的依赖关系)需要更长的时间.我在下面创建了一个小测试来演示时差.除了Alpine更新和下载构建依赖项以安装Pandas和Numpy的几秒钟之外,为什么setup.py需要比Debian安装多70倍的时间?
有没有办法加速使用Alpine作为基本图像的安装,或者是否有另一个与Alpine相当的基本图像,最好用于像Pandas和Numpy这样的软件包?
Dockerfile.debian
FROM python:3.6.4-slim-jessie
RUN pip install pandas
Run Code Online (Sandbox Code Playgroud)
使用Pandas&Numpy构建Debian映像:
[PandasDockerTest] time docker build -t debian-pandas -f Dockerfile.debian . --no-cache
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM python:3.6.4-slim-jessie
---> 43431c5410f3
Step 2/2 : RUN pip install pandas
---> Running in 2e4c030f8051
Collecting pandas
Downloading pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl (26.2MB)
Collecting numpy>=1.9.0 (from pandas)
Downloading numpy-1.14.1-cp36-cp36m-manylinux1_x86_64.whl (12.2MB)
Collecting pytz>=2011k (from pandas)
Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
Collecting python-dateutil>=2 (from pandas)
Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
Collecting six>=1.5 (from python-dateutil>=2->pandas)
Downloading six-1.11.0-py2.py3-none-any.whl
Installing collected packages: …Run Code Online (Sandbox Code Playgroud) 我正在使用alpine(或基于Alpine的图像)作为我的Dockerfile中的基本图像.我需要添加哪些说明来创建用户?
最终我将使用此用户运行我将放入容器的应用程序,以便root用户不会.
第一次运行alpine docker容器并尝试openssh安装时,会发生以下情况:
ole@T:~$ docker run -it --rm alpine /bin/ash
/ # apk add openssh
WARNING: Ignoring APKINDEX.d3812b7e.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.bb2c5760.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
openssh (missing):
required by: world[openssh]
Run Code Online (Sandbox Code Playgroud)
应该如何安装openssh?
给定一个二进制文件,使用Go编译GOOS=linux并基于此GOARCH=amd64部署到docker容器alpine:3.3,如果docker引擎主机是Ubuntu(15.10),二进制文件将不会运行:
sh: /bin/artisan: not found
Run Code Online (Sandbox Code Playgroud)
如果在Mac OS X上的VirtualBox VM中部署了docker引擎主机(它是基础),那么相同的二进制文件(针对相同的OS和arch编译)将运行得很好.busyboxalpine
如果容器基于Ubuntu映像之一,那么同样的二进制文件也将完美运行.
知道这个二进制文件丢失了吗?
这是我为重现而做的(在OS X上的VirtualBox/busybox中成功运行未显示):
构建(即使拱匹配,也使用标记显式构建):
? artisan git:(master) ? GOOS=linux GOARCH=amd64 go build
Run Code Online (Sandbox Code Playgroud)
检查它是否可以在主机上运行:
? artisan git:(master) ? ./artisan
10:14:04.925 [ERROR] artisan: need a command, one of server, provision or build
Run Code Online (Sandbox Code Playgroud)
复制到docker目录,构建,运行:
? artisan git:(master) ? cp artisan docker/build/bin/
? artisan git:(master) ? cd docker
? docker git:(master) ? cat Dockerfile
FROM docker:1.10
COPY build/ /
? docker git:(master) …Run Code Online (Sandbox Code Playgroud) alpine-linux ×10
docker ×9
linux ×3
dockerfile ×2
apk ×1
bash ×1
busybox ×1
certificate ×1
containers ×1
go ×1
install ×1
java ×1
java-11 ×1
numpy ×1
pandas ×1
python ×1
python-2.7 ×1
ssl ×1