我目前正在尝试在 docker compose 中设置 SQL Server,并且想使用指令在构建时创建数据库RUN。这不起作用,但是当我使用 sh 在正在运行的容器上执行相同的命令时,它起作用
我的撰写文件如下所示:
version: "3.7"
services:
mssql:
build: ./mssql
environment:
SA_PASSWORD: "Password12345!"
ACCEPT_EULA: "Y"
container_name: mssqlDB
ports:
- "1433:1433"
restart: always
Run Code Online (Sandbox Code Playgroud)
这是我的 Dockerfile:
FROM mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
COPY ./prod.sql /
RUN ./opt/mssql-bin/sqlcmd -S localhost -U SA -P "Password12345!" -Q "Create Database HelloWorld"
CMD ["/opt/mssql/bin/sqlservr"]
Run Code Online (Sandbox Code Playgroud) 我对 Docker 比较陌生,作为一个实验,我尝试使用以下 Dockerfile 创建一个通用的 Django 开发容器:
FROM python
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get dist-upgrade -y
RUN mkdir /code
WORKDIR /code
RUN python3 -m venv djangoProject
RUN /bin/bash -c "source /code/djangoProject/bin/activate && python3 -m pip install --upgrade pip && pip install django"
EXPOSE 8000
Run Code Online (Sandbox Code Playgroud)
图像似乎构建得很好,但是当我去运行容器时:
docker container run -v /home/me/dev/djangoRESTreact/code:/code -it --rm djangodev /bin/bash
Run Code Online (Sandbox Code Playgroud)
我的本地挂载 /home/me/dev/djangoRESTreact/code 未填充我期望从此 Dockerfile 和挂载中获得的 djangoProject venv 目录。docker 容器在 /code 处还有一个空目录。python3 -m venv djangoProject如果我直接在容器内运行,则会创建 venv 目录,并且我可以在主机上和容器内看到它。
知道为什么我的 venv 没有在映像和后续容器中创建吗?
我正在拔头发。
提前致谢!
使用 gitlab-python 包,我想从所有 Dockerfile 中提取行。使用下面的代码,我可以获取项目名称和我想要的存储库的 url,但如何确保存在 Dockerfile 并读取 Dockerfile 的内容。
import gitlab
import json
from pprint import pprint
import requests
import urllib.request
# private token authentication
gl = gitlab.Gitlab('<path_to_gitlab_repo>', private_token=<token_here>)
gl.auth()
# list all projects
projects = gl.projects.list()
for project in projects:
# print(project) # prints all the meta data for the project
print("Project: ", project.name)
print("Gitlab URL: ", project.http_url_to_repo)
# print("Branches: ", project.repo_branches)
pprint(project.repository_tree(all=True))
f = urllib.request.urlopen(project.http_url_to_repo)
myfile = f.read()
print(myfile)
print("\n\n")
Run Code Online (Sandbox Code Playgroud)
我现在得到的输出是:
Gitlab URL: <path_to_gitlab_repo>
[{'id': '0c4a64925f5c129d33557',
'mode': …Run Code Online (Sandbox Code Playgroud) 我正在使用私有 docker hub 存储库https://hub.docker.com/u/privaterepoexample/,之后我使用以下命令构建了我的 docker 映像:
docker login\ndocker build -t privaterepoexample/sre:local .\ndocker tag 85cf9475bc1c privaterepoexample/sre\ndocker push privaterepoexample/sre\nRun Code Online (Sandbox Code Playgroud)\n\ndocker build 的输出显示已login.sh添加到容器中:
Executing busybox-1.29.3-r10.trigger\nOK: 85 MiB in 57 packages\nRemoving intermediate container 12fd67450dfc\n ---> e9ca0b9e4ac4\nStep 5/7 : WORKDIR /opt\n---> Running in ce881ede94aa\nRemoving intermediate container ce881ede94aa\n---> 2335b4f522ac\nStep 6/7 : ADD login.sh /opt\n---> 2aabf1712153\nStep 7/7 : CMD ["chmod 755 login.sh && ./login.sh"]\n ---> Running in 8ec824d4e561\nRemoving intermediate container 8ec824d4e561\n ---> c97a4ad61578\nSuccessfully built c97a4ad61578\nSuccessfully tagged privaterepoexample/sre:local\nRun Code Online (Sandbox Code Playgroud)\n\n下面的 Dockerfile …
我想在我的 docker 映像中安装 sql cmd。我的 dockerfile 有这些命令来安装 sqlcmd (centos 7 基本映像)
RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo
RUN yum remove mssql-tools unixODBC-utf16-devel
RUN yum install -y unixODBC-devel mssql-tools
Run Code Online (Sandbox Code Playgroud)
以下是 docker 构建日志
Transaction test succeeded
Running transaction
Updating : libcom_err-1.42.9-17.el7.x86_64 1/14
Installing : unixODBC-2.3.7-1.rh.x86_64 2/14
Updating : libss-1.42.9-17.el7.x86_64 3/14
Installing : e2fsprogs-libs-1.42.9-17.el7.x86_64 4/14
Installing : e2fsprogs-1.42.9-17.el7.x86_64 5/14
Updating : 1:openssl-libs-1.0.2k-19.el7.x86_64 6/14
Installing : 1:make-3.82-24.el7.x86_64 7/14
Installing : 1:openssl-1.0.2k-19.el7.x86_64 8/14
/var/tmp/rpm-tmp.8S1dKq: line 17: /dev/tty: No such device or address
error: %pre(msodbcsql17-17.5.2.1-1.x86_64) scriptlet failed, …Run Code Online (Sandbox Code Playgroud) 我正在对 PHP 应用程序进行容器化,并希望根据环境变量修改 Apache 配置。这是在覆盖默认值的脚本中完成的ENTRYPOINT:
FROM php:7.2-apache
# ...
COPY prepare-docker-configs.sh .
RUN chmod +x prepare-docker-configs.sh
ENTRYPOINT ./prepare-docker-configs.sh
Run Code Online (Sandbox Code Playgroud)
进行这些修改后,Apache 不会启动。apache2-foreground似乎缺少命令,所以我在末尾运行它prepare-docker-configs.sh
#!/bin/bash
# ... Some config substitution
apache2-foreground
Run Code Online (Sandbox Code Playgroud)
现在 Apache 已经启动,一切都按预期进行。但我注意到停止容器比以前慢得多。我跑time docker-compose down了两个星座:
ENTRYPOINTreal 0m2,080s
user 0m0,449s
sys 0m0,064
Run Code Online (Sandbox Code Playgroud)
ENTRYPOINTreal 0m12,247s
user 0m0,491s
sys 0m0,067s
Run Code Online (Sandbox Code Playgroud)
所以需要大约10秒的时间。特别是在需要进行大量测试的开发过程中,这总共会浪费大量时间。
ENTRYPOINT停止速度如此之慢?如何解决?我尝试STOPSIGNAL SIGWINCH从原始 Dockerfile 添加并运行docker-php-entrypoint,两者都没有帮助。
该docker-compose.yml文件没什么特别的。由于内部冲突,它只是定义了服务并覆盖默认网络:
version: '2'
services:
app:
build:
context: .
args: …Run Code Online (Sandbox Code Playgroud) 我已经使用两个 docker 映像成功地对我的应用程序进行了 dockerize,一个用于 nginx,第二个用于应用程序,并且它运行良好,因为我使用 docker compose。现在我只想拥有一个包含应用程序和 nginx 的 Dockerfile,然后在我的本地计算机上运行它。我怎样才能做到这一点?
这是我的nginx/default.conf
# Cache zone
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=7d use_temp_path=off;
upstream nextjs {
server nextjs:3000;
}
server {
listen 80 default_server;
server_name _;
server_tokens off;
gzip on;
gzip_proxied any;
gzip_comp_level 4;
gzip_types text/css application/javascript image/svg+xml;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# BUILT ASSETS (E.G. JS BUNDLES)
# Browser cache - max cache headers from Next.js as build id in url
# …Run Code Online (Sandbox Code Playgroud) 我对 Node.js 进行了 docker 化,一切正常
Dockerfile:
FROM node:alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
EXPOSE 9000
CMD ["npm", "run", "dev"]
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 Dockerfile 之外运行npm install并将内容复制npm install到 docker 容器
在我运行的 docker 主机上
npm install --prefix /opt/npm/ -g
Run Code Online (Sandbox Code Playgroud)
文件夹/opt/npm/lib/node_modules/ui已创建。在该文件夹中,有一堆 json 文件和文件夹 node_modules。Dockerfile 位于该文件夹中。现在,在 Dockerfile 中,我跳过了 npm install,只是将 /opt/npm/lib/node_modules/ui 的内容复制到 docker 容器。
修改后的 Dockerfile
FROM node:alpine
WORKDIR '/app'
COPY . .
EXPOSE 9000
Run Code Online (Sandbox Code Playgroud)
已成功从 Dockerfile 构建映像,但是当尝试从该映像运行容器时
docker run -p 9000:4200 pm
> ui@0.0.0 …Run Code Online (Sandbox Code Playgroud) 所以我对创建容器还很陌生,我有一个简单的 Dockerfile,我想在其中每分钟运行一个简单的 python 脚本:
FROM python:3.8-buster
RUN apt-get update && apt-get install -y cron
COPY my_python /bin/my_python
COPY root /var/spool/cron/crontabs/root
RUN chmod +x /bin/my_python
CMD cron -l 2 -f
Run Code Online (Sandbox Code Playgroud)
其中我的_python:
print("hi world!!")
Run Code Online (Sandbox Code Playgroud)
和根:
* * * * * python3 /bin/my_python
Run Code Online (Sandbox Code Playgroud)
然后我只创建图像和容器:
docker image build -t python-test
docker container run -it --name python-test python-test
Run Code Online (Sandbox Code Playgroud)
我应该每分钟都会看到一个带有 hi world 的打印,但是当运行容器时(在图像构建之后)似乎没有出现日志。
我究竟做错了什么?
我的 Go 项目层次结构是这样的:
主要功能:
func main() {
path, _ := os.Getwd()
err := godotenv.Load(filepath.Join(path, ".env"))
if err != nil {
log.Fatal("Error loading .env file")
}
server.Init()
}
Run Code Online (Sandbox Code Playgroud)
这是我的docker文件内容:
FROM golang:alpine AS build-env
LABEL MAINTAINER "Amit Pal <amit.pal@fynchmobility.com>"
ENV GOPATH /go
WORKDIR /go/src
COPY . /go/src/gothamcity
RUN cd /go/src/gothamcity && go build .
FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk*
WORKDIR /app
COPY --from=build-env /go/src/gothamcity/gothamcity /app
EXPOSE 8080
ENTRYPOINT [ "./gothamcity" ]
Run Code Online (Sandbox Code Playgroud)
我运行以下命令来构建并运行 …
dockerfile ×10
docker ×8
python ×2
apache2 ×1
centos ×1
containers ×1
cron ×1
gitlab ×1
gitlab-api ×1
go ×1
kubernetes ×1
next.js ×1
nginx ×1
node.js ×1
npm-install ×1
performance ×1
shell ×1
sql-server ×1
sqlcmd ×1
tty ×1