docker - Docker 映像通过 docker run 启动正常,但 docker-compose 失败并出现“$PATH 中找不到可执行文件:未知”错误
问题描述
我正在尝试使用 Librespeed Speedtest 应用程序部署 Caddy 代理。
我正在使用
docker build -t app .
以下 Dockerfile 在本地构建一个 docker 映像:
FROM php:7.4-apache
# Install extensions
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
# Prepare files and folders
RUN mkdir -p /speedtest/
# Copy sources
COPY backend/ /speedtest/backend
COPY results/*.php /speedtest/results/
COPY results/*.ttf /speedtest/results/
COPY *.js /speedtest/
COPY favicon.ico /speedtest/
COPY docker/servers.json /servers.json
COPY docker/*.php /speedtest/
COPY docker/entrypoint.sh /
# Prepare environment variables defaults
ENV TITLE=LibreSpeed
ENV MODE=standalone
ENV PASSWORD=password
ENV TELEMETRY=false
ENV ENABLE_ID_OBFUSCATION=false
ENV REDACT_IP_ADDRESSES=false
ENV WEBPORT=80
# Final touches
EXPOSE 80
CMD ["bash", "/entrypoint.sh"]
此 Dockerfile 构建文件结构并运行以下脚本:
#!/bin/bash
set -e
set -x
# Cleanup
rm -rf /var/www/html/*
# Copy frontend files
cp /speedtest/*.js /var/www/html/
# Copy favicon
cp /speedtest/favicon.ico /var/www/html/
# Set up backend side for standlone modes
if [ "$MODE" == "standalone" ]; then
cp -r /speedtest/backend/ /var/www/html/backend
if [ ! -z "$IPINFO_APIKEY" ]; then
sed -i s/\$IPINFO_APIKEY\ =\ \'\'/\$IPINFO_APIKEY\ =\ \'$IPINFO_APIKEY\'/g /var/www/html/backend/getIP_ipInfo_apikey.php
fi
fi
if [ "$MODE" == "backend" ]; then
cp -r /speedtest/backend/* /var/www/html
if [ ! -z "$IPINFO_APIKEY" ]; then
sed -i s/\$IPINFO_APIKEY\ =\ \'\'/\$IPINFO_APIKEY\ =\ \'$IPINFO_APIKEY\'/g /var/www/html/getIP_ipInfo_apikey.php
fi
fi
# Set up index.php for frontend-only or standalone modes
if [ "$MODE" == "frontend" ]; then
cp /speedtest/frontend.php /var/www/html/index.php
elif [ "$MODE" == "standalone" ]; then
cp /speedtest/standalone.php /var/www/html/index.php
fi
# Apply Telemetry settings when running in standalone or frontend mode and telemetry is enabled
if [[ "$TELEMETRY" == "true" && ( "$MODE" == "frontend" || "$MODE" == "standalone" ) ]]; then
cp -r /speedtest/results /var/www/html/results
sed -i s/\$db_type\ =\ \'.*\'/\$db_type\ =\ \'sqlite\'\/g /var/www/html/results/telemetry_settings.php
sed -i s/\$Sqlite_db_file\ =\ \'.*\'/\$Sqlite_db_file=\'\\\/database\\\/db.sql\'/g /var/www/html/results/telemetry_settings.php
sed -i s/\$stats_password\ =\ \'.*\'/\$stats_password\ =\ \'$PASSWORD\'/g /var/www/html/results/telemetry_settings.php
if [ "$ENABLE_ID_OBFUSCATION" == "true" ]; then
sed -i s/\$enable_id_obfuscation\ =\ .*\;/\$enable_id_obfuscation\ =\ true\;/g /var/www/html/results/telemetry_settings.php
fi
if [ "$REDACT_IP_ADDRESSES" == "true" ]; then
sed -i s/\$redact_ip_addresses\ =\ .*\;/\$redact_ip_addresses\ =\ true\;/g /var/www/html/results/telemetry_settings.php
fi
mkdir -p /database/
chown www-data /database/
fi
chown -R www-data /var/www/html/*
# Allow selection of Apache port for network_mode: host
if [ "$WEBPORT" != "80" ]; then
sed -i "s/^Listen 80\$/Listen $WEBPORT/g" /etc/apache2/ports.conf
sed -i "s/*:80>/*:$WEBPORT>/g" /etc/apache2/sites-available/000-default.conf
fi
echo "Done, Starting APACHE"
# This runs apache
apache2-foreground
然后我就运行它
docker run -d -p '2015:80' app
一切都很完美。
但是当我尝试使用以下 docker-compose 运行该图像时
version: "3.7"
services:
caddy:
image: caddy:2.3.0-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- $PWD/Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
app:
image: app
ports:
- 2015:80
restart: unless-stopped
#command: "bash /entrypoint.sh"
volumes:
caddy_data:
caddy_config:
我收到以下错误:
$ docker-compose -f app.compose.yml 运行 caddy app
来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:370:启动容器进程导致:exec:“app”:$PATH 中找不到可执行文件:未知
正如您在注释掉的命令部分所看到的那样,我尝试entrypoint.sh
手动调用字符串和["bash", "/entrypoint.sh"]
. 但一切都没有改变。
看起来我错过了使用 docker-compose 和 docker 运行图像之间的区别。但究竟是什么?
解决方案
您使用了错误的命令。
docker-compose run
类似于docker exec
。您想docker-compose -f app.compose.yml up -d
在后台docker-compose -f app.compose.yml up
运行它或在前台运行它(类似于-ti
in docker run
)
推荐阅读
- node.js - 如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达
- javascript - GET http://localhost:3000/public/js/test.js net::ERR_ABORTED 404(未找到)
- python - 使用临时凭证将数据从 S3 存储桶传输到 GCP 存储桶
- python - 无法更改桌面背景(Python)
- css - CSS 网格无法在实际的移动浏览器上正确显示(尽管在桌面上测试移动屏幕时所有显示都正确)
- android - Android SurfaceView 错误
- excel - 在 VBA 中创建动态字典数组
- awk - 汇总列并放在列旁边
- r - 通过正则表达式仅选择向量中包含 2 个单词的字符串
- javascript - 如何调整反应模块?